@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.
Files changed (70) hide show
  1. package/dist/cli/commands/apply.js +10 -5
  2. package/dist/cli/commands/apply.js.map +1 -1
  3. package/dist/cli/commands/generate.d.ts +1 -1
  4. package/dist/cli/commands/generate.js +23 -10
  5. package/dist/cli/commands/generate.js.map +1 -1
  6. package/dist/cli/commands/open.d.ts +1 -1
  7. package/dist/cli/commands/open.js +8 -2
  8. package/dist/cli/commands/open.js.map +1 -1
  9. package/dist/cli/commands/push.js +9 -4
  10. package/dist/cli/commands/push.js.map +1 -1
  11. package/dist/cli/commands/reset.js +14 -2
  12. package/dist/cli/commands/reset.js.map +1 -1
  13. package/dist/cli/commands/run.d.ts +3 -6
  14. package/dist/cli/commands/run.js +75 -82
  15. package/dist/cli/commands/run.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.js +25 -19
  18. package/dist/index.js.map +1 -1
  19. package/dist/manifest.d.ts +45 -7
  20. package/dist/manifest.js +25 -19
  21. package/dist/manifest.js.map +1 -1
  22. package/dist/rest/handlers/actions-handler.js +9 -5
  23. package/dist/rest/handlers/actions-handler.js.map +1 -1
  24. package/dist/rest/handlers/apply-handler.js +2 -2
  25. package/dist/rest/handlers/apply-handler.js.map +1 -1
  26. package/dist/rest/handlers/diff-handler.d.ts +2 -2
  27. package/dist/rest/handlers/diff-handler.js +2 -2
  28. package/dist/rest/handlers/diff-handler.js.map +1 -1
  29. package/dist/rest/handlers/files-handler.js +2 -2
  30. package/dist/rest/handlers/files-handler.js.map +1 -1
  31. package/dist/rest/handlers/generate-handler.d.ts +2 -2
  32. package/dist/rest/handlers/generate-handler.js +2 -2
  33. package/dist/rest/handlers/generate-handler.js.map +1 -1
  34. package/dist/rest/handlers/git-status-handler.js +2 -2
  35. package/dist/rest/handlers/git-status-handler.js.map +1 -1
  36. package/dist/rest/handlers/patch-plan-handler.js +40 -36
  37. package/dist/rest/handlers/patch-plan-handler.js.map +1 -1
  38. package/dist/rest/handlers/plan-handler.d.ts +1 -1
  39. package/dist/rest/handlers/plan-handler.js +2 -5
  40. package/dist/rest/handlers/plan-handler.js.map +1 -1
  41. package/dist/rest/handlers/push-handler.js +2 -2
  42. package/dist/rest/handlers/push-handler.js.map +1 -1
  43. package/dist/rest/handlers/regenerate-handler.d.ts +1 -1
  44. package/dist/rest/handlers/regenerate-handler.js +2 -2
  45. package/dist/rest/handlers/regenerate-handler.js.map +1 -1
  46. package/dist/rest/handlers/reset-handler.d.ts +1 -1
  47. package/dist/rest/handlers/reset-handler.js +2 -6
  48. package/dist/rest/handlers/reset-handler.js.map +1 -1
  49. package/dist/rest/handlers/scopes-handler.js +17 -13
  50. package/dist/rest/handlers/scopes-handler.js.map +1 -1
  51. package/dist/rest/handlers/status-handler.js +2 -9
  52. package/dist/rest/handlers/status-handler.js.map +1 -1
  53. package/dist/rest/handlers/summarize-handler.d.ts +1 -1
  54. package/dist/rest/handlers/summarize-handler.js +2 -2
  55. package/dist/rest/handlers/summarize-handler.js.map +1 -1
  56. package/dist/widgets/117.js +24 -1
  57. package/dist/widgets/117.js.map +1 -1
  58. package/dist/widgets/370.js +1 -1
  59. package/dist/widgets/370.js.map +1 -1
  60. package/dist/widgets/62.js +97 -0
  61. package/dist/widgets/62.js.map +1 -0
  62. package/dist/widgets/__federation_expose_CommitOverview.js +1 -1
  63. package/dist/widgets/__federation_expose_CommitOverview.js.map +1 -1
  64. package/dist/widgets/mf-manifest.json +27 -27
  65. package/dist/widgets/mf-stats.json +27 -27
  66. package/dist/widgets/remoteEntry.js +2 -2
  67. package/dist/widgets/remoteEntry.js.map +1 -1
  68. package/package.json +8 -7
  69. package/dist/widgets/418.js +0 -39
  70. package/dist/widgets/418.js.map +0 -1
@@ -1,47 +1,51 @@
1
- import { defineHandler } from '@kb-labs/sdk';
1
+ import { defineHandler, rethrowForRest } from '@kb-labs/sdk';
2
2
  import { ConventionalTypeSchema, COMMIT_CACHE_PREFIX } from '@kb-labs/commit-contracts';
3
3
  import { loadPlan, savePlan } from '@kb-labs/commit-core/storage';
4
4
 
5
5
  // src/rest/handlers/patch-plan-handler.ts
6
6
  var patch_plan_handler_default = defineHandler({
7
7
  async execute(ctx, input) {
8
- const { scope = "root", commitId, message, type, scope_: commitScope, body } = input.body ?? {};
9
- if (!commitId) {
10
- throw new Error("commitId is required");
11
- }
12
- const plan = await loadPlan(ctx.cwd, scope);
13
- if (!plan) {
14
- throw new Error("No commit plan found. Generate a plan first.");
15
- }
16
- const commitIndex = plan.commits.findIndex((c) => c.id === commitId);
17
- if (commitIndex === -1) {
18
- throw new Error(`Commit "${commitId}" not found in plan`);
19
- }
20
- const commit = plan.commits[commitIndex];
21
- if (message !== void 0) {
22
- commit.message = message;
23
- }
24
- if (type !== void 0) {
25
- const parsed = ConventionalTypeSchema.safeParse(type);
26
- if (parsed.success) {
27
- commit.type = parsed.data;
8
+ try {
9
+ const { scope = "root", commitId, message, type, scope_: commitScope, body } = input.body ?? {};
10
+ if (!commitId) {
11
+ throw new Error("commitId is required");
28
12
  }
13
+ const plan = await loadPlan(ctx.cwd, scope);
14
+ if (!plan) {
15
+ throw new Error("No commit plan found. Generate a plan first.");
16
+ }
17
+ const commitIndex = plan.commits.findIndex((c) => c.id === commitId);
18
+ if (commitIndex === -1) {
19
+ throw new Error(`Commit "${commitId}" not found in plan`);
20
+ }
21
+ const commit = plan.commits[commitIndex];
22
+ if (message !== void 0) {
23
+ commit.message = message;
24
+ }
25
+ if (type !== void 0) {
26
+ const parsed = ConventionalTypeSchema.safeParse(type);
27
+ if (parsed.success) {
28
+ commit.type = parsed.data;
29
+ }
30
+ }
31
+ if (commitScope !== void 0) {
32
+ commit.scope = commitScope || void 0;
33
+ }
34
+ if (body !== void 0) {
35
+ commit.body = body || void 0;
36
+ }
37
+ plan.commits[commitIndex] = commit;
38
+ await savePlan(ctx.cwd, plan, scope);
39
+ const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;
40
+ await ctx.platform.cache.delete(appliedCacheKey);
41
+ return {
42
+ success: true,
43
+ scope,
44
+ commitId
45
+ };
46
+ } catch (err) {
47
+ rethrowForRest(err);
29
48
  }
30
- if (commitScope !== void 0) {
31
- commit.scope = commitScope || void 0;
32
- }
33
- if (body !== void 0) {
34
- commit.body = body || void 0;
35
- }
36
- plan.commits[commitIndex] = commit;
37
- await savePlan(ctx.cwd, plan, scope);
38
- const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;
39
- await ctx.platform.cache.delete(appliedCacheKey);
40
- return {
41
- success: true,
42
- scope,
43
- commitId
44
- };
45
49
  }
46
50
  });
47
51
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/patch-plan-handler.ts"],"names":[],"mappings":";;;;;AAeA,IAAO,6BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAyE;AAC3G,IAAA,MAAM,EAAE,KAAA,GAAQ,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAK,GAAI,KAAA,CAAM,IAAA,IAAQ,EAAC;AAE9F,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ,CAAA;AACjE,IAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,CAAA,mBAAA,CAAqB,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAEvC,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AAAA,IACnB;AACA,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,SAAA,CAAU,IAAI,CAAA;AACpD,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,MAAA,CAAO,QAAQ,WAAA,IAAe,MAAA;AAAA,IAChC;AACA,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAA,CAAO,OAAO,IAAA,IAAQ,MAAA;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,GAAI,MAAA;AAC5B,IAAA,MAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAGnC,IAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,mBAAmB,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA;AACnE,IAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,eAAe,CAAA;AAE/C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC","file":"patch-plan-handler.js","sourcesContent":["import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n COMMIT_CACHE_PREFIX,\n type PatchPlanRequest,\n type PatchPlanResponse,\n ConventionalTypeSchema,\n} from '@kb-labs/commit-contracts';\nimport { loadPlan, savePlan } from '@kb-labs/commit-core/storage';\n\n/**\n * PATCH /plan handler\n *\n * Edits a single commit's message, type, scope, or body in the stored plan\n * without triggering LLM regeneration.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<unknown, PatchPlanRequest>): Promise<PatchPlanResponse> {\n const { scope = 'root', commitId, message, type, scope_: commitScope, body } = input.body ?? {};\n\n if (!commitId) {\n throw new Error('commitId is required');\n }\n\n const plan = await loadPlan(ctx.cwd, scope);\n if (!plan) {\n throw new Error('No commit plan found. Generate a plan first.');\n }\n\n const commitIndex = plan.commits.findIndex(c => c.id === commitId);\n if (commitIndex === -1) {\n throw new Error(`Commit \"${commitId}\" not found in plan`);\n }\n\n const commit = plan.commits[commitIndex]!;\n\n if (message !== undefined) {\n commit.message = message;\n }\n if (type !== undefined) {\n const parsed = ConventionalTypeSchema.safeParse(type);\n if (parsed.success) {\n commit.type = parsed.data;\n }\n }\n if (commitScope !== undefined) {\n commit.scope = commitScope || undefined;\n }\n if (body !== undefined) {\n commit.body = body || undefined;\n }\n\n plan.commits[commitIndex] = commit;\n await savePlan(ctx.cwd, plan, scope);\n\n // Plan content changed => previously applied state is stale.\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n await ctx.platform.cache.delete(appliedCacheKey);\n\n return {\n success: true,\n scope,\n commitId,\n };\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/patch-plan-handler.ts"],"names":[],"mappings":";;;;;AAeA,IAAO,6BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAyE;AAC3G,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,GAAQ,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAK,GAAI,KAAA,CAAM,IAAA,IAAQ,EAAC;AAE9F,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,MACxC;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,cAAc,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ,CAAA;AACjE,MAAA,IAAI,gBAAgB,CAAA,CAAA,EAAI;AACtB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,CAAA,mBAAA,CAAqB,CAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAEvC,MAAA,IAAI,YAAY,KAAA,CAAA,EAAW;AACzB,QAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AAAA,MACnB;AACA,MAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,QAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,SAAA,CAAU,IAAI,CAAA;AACpD,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AAAA,QACvB;AAAA,MACF;AACA,MAAA,IAAI,gBAAgB,KAAA,CAAA,EAAW;AAC7B,QAAA,MAAA,CAAO,QAAQ,WAAA,IAAe,KAAA,CAAA;AAAA,MAChC;AACA,MAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,QAAA,MAAA,CAAO,OAAO,IAAA,IAAQ,KAAA,CAAA;AAAA,MACxB;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,GAAI,MAAA;AAC5B,MAAA,MAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAGnC,MAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,mBAAmB,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA;AACnE,MAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,eAAe,CAAA;AAE/C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"patch-plan-handler.js","sourcesContent":["import { defineHandler, type PluginContextV3, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport {\n COMMIT_CACHE_PREFIX,\n type PatchPlanRequest,\n type PatchPlanResponse,\n ConventionalTypeSchema,\n} from '@kb-labs/commit-contracts';\nimport { loadPlan, savePlan } from '@kb-labs/commit-core/storage';\n\n/**\n * PATCH /plan handler\n *\n * Edits a single commit's message, type, scope, or body in the stored plan\n * without triggering LLM regeneration.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<unknown, PatchPlanRequest>): Promise<PatchPlanResponse> {\n try {\n const { scope = 'root', commitId, message, type, scope_: commitScope, body } = input.body ?? {};\n\n if (!commitId) {\n throw new Error('commitId is required');\n }\n\n const plan = await loadPlan(ctx.cwd, scope);\n if (!plan) {\n throw new Error('No commit plan found. Generate a plan first.');\n }\n\n const commitIndex = plan.commits.findIndex(c => c.id === commitId);\n if (commitIndex === -1) {\n throw new Error(`Commit \"${commitId}\" not found in plan`);\n }\n\n const commit = plan.commits[commitIndex]!;\n\n if (message !== undefined) {\n commit.message = message;\n }\n if (type !== undefined) {\n const parsed = ConventionalTypeSchema.safeParse(type);\n if (parsed.success) {\n commit.type = parsed.data;\n }\n }\n if (commitScope !== undefined) {\n commit.scope = commitScope || undefined;\n }\n if (body !== undefined) {\n commit.body = body || undefined;\n }\n\n plan.commits[commitIndex] = commit;\n await savePlan(ctx.cwd, plan, scope);\n\n // Plan content changed => previously applied state is stale.\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n await ctx.platform.cache.delete(appliedCacheKey);\n\n return {\n success: true,\n scope,\n commitId,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -25,7 +25,7 @@ declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{
25
25
  type: "feat" | "fix" | "refactor" | "chore" | "docs" | "test" | "build" | "ci" | "perf";
26
26
  id: string;
27
27
  files: string[];
28
- releaseHint: "minor" | "none" | "patch" | "major";
28
+ releaseHint: "none" | "patch" | "minor" | "major";
29
29
  breaking: boolean;
30
30
  scope?: string | undefined;
31
31
  body?: string | undefined;
@@ -1,4 +1,4 @@
1
- import { defineHandler } from '@kb-labs/sdk';
1
+ import { defineHandler, rethrowForRest } from '@kb-labs/sdk';
2
2
  import { loadPlan } from '@kb-labs/commit-core/storage';
3
3
 
4
4
  // src/rest/handlers/plan-handler.ts
@@ -19,10 +19,7 @@ var plan_handler_default = defineHandler({
19
19
  scope
20
20
  };
21
21
  } catch (error) {
22
- return {
23
- hasPlan: false,
24
- scope
25
- };
22
+ rethrowForRest(error);
26
23
  }
27
24
  }
28
25
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/plan-handler.ts"],"names":[],"mappings":";;;;AASA,IAAO,uBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAsE;AACxG,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,MAAA;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AAE1C,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF,CAAC","file":"plan-handler.js","sourcesContent":["import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadPlan } from '@kb-labs/commit-core/storage';\nimport type { PlanResponse } from '@kb-labs/commit-contracts';\n\n/**\n * GET /plan handler\n *\n * Returns the current commit plan for Studio.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ scope?: string }, unknown>): Promise<PlanResponse> {\n const scope = input.query?.scope || 'root';\n\n try {\n const plan = await loadPlan(ctx.cwd, scope);\n\n if (!plan || plan.commits.length === 0) {\n return {\n hasPlan: false,\n scope,\n };\n }\n\n return {\n hasPlan: true,\n plan,\n scope,\n };\n } catch (error) {\n return {\n hasPlan: false,\n scope,\n };\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/plan-handler.ts"],"names":[],"mappings":";;;;AASA,IAAO,uBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAsE;AACxG,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,MAAA;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AAE1C,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAC","file":"plan-handler.js","sourcesContent":["import { defineHandler, type PluginContextV3, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport { loadPlan } from '@kb-labs/commit-core/storage';\nimport type { PlanResponse } from '@kb-labs/commit-contracts';\n\n/**\n * GET /plan handler\n *\n * Returns the current commit plan for Studio.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ scope?: string }, unknown>): Promise<PlanResponse> {\n const scope = input.query?.scope || 'root';\n\n try {\n const plan = await loadPlan(ctx.cwd, scope);\n\n if (!plan || plan.commits.length === 0) {\n return {\n hasPlan: false,\n scope,\n };\n }\n\n return {\n hasPlan: true,\n plan,\n scope,\n };\n } catch (error) {\n rethrowForRest(error);\n }\n },\n});\n"]}
@@ -1,4 +1,4 @@
1
- import { defineHandler, useConfig } from '@kb-labs/sdk';
1
+ import { defineHandler, useConfig, rethrowForRest } from '@kb-labs/sdk';
2
2
  import { resolveCommitConfig, COMMIT_CACHE_PREFIX } from '@kb-labs/commit-contracts';
3
3
  import { pushCommits } from '@kb-labs/commit-core/applier';
4
4
  import { loadPlan, saveToHistory, clearPlan } from '@kb-labs/commit-core/storage';
@@ -65,7 +65,7 @@ var push_handler_default = defineHandler({
65
65
  durationMs: Date.now() - startTime
66
66
  });
67
67
  }
68
- throw new Error(`Failed to push commits: ${error}`);
68
+ rethrowForRest(error);
69
69
  }
70
70
  }
71
71
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/rest/handlers/push-handler.ts"],"names":[],"mappings":"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","file":"push-handler.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","import { defineHandler, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n COMMIT_CACHE_PREFIX,\n type PushRequest,\n type PushResponse,\n type CommitPluginConfig,\n resolveCommitConfig,\n} from '@kb-labs/commit-contracts';\nimport { pushCommits } from '@kb-labs/commit-core/applier';\nimport { loadPlan, saveToHistory, clearPlan } from '@kb-labs/commit-core/storage';\nimport { resolveScopePath } from './scope-resolver';\n\n/**\n * POST /push handler\n *\n * Pushes commits to the remote repository.\n * After successful push, saves plan to history and clears current plan.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<unknown, PushRequest>): Promise<PushResponse> {\n const { scope = 'root', remote, force } = input.body ?? {};\n const startTime = Date.now();\n\n try {\n // Load the plan before pushing (we'll need it for history)\n const plan = await loadPlan(ctx.cwd, scope);\n\n // Resolve scope to actual directory path\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(ctx.cwd, scope, config.scope?.scopes);\n\n // Push commits (git runs FROM scopeCwd)\n const result = await pushCommits(scopeCwd, { remote, force, scope });\n\n // After successful push, save to history and clear the plan\n if (result.success && plan) {\n // Save to history with push result\n await saveToHistory(ctx.cwd, plan, {\n success: true,\n appliedCommits: [],\n errors: []\n }, scope);\n\n // Clear current plan\n await clearPlan(ctx.cwd, scope);\n\n // Clear applied status cache\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n await ctx.platform.cache.delete(appliedCacheKey);\n }\n\n // Track success/failure\n if (ctx.platform.analytics) {\n if (result.success) {\n await ctx.platform.analytics.track('commit.push.success', {\n scope,\n remote,\n force,\n commitsPushed: plan?.commits.length || 0,\n durationMs: Date.now() - startTime,\n });\n } else {\n await ctx.platform.analytics.track('commit.push.failed', {\n scope,\n remote,\n force,\n error: result.error,\n durationMs: Date.now() - startTime,\n });\n }\n }\n\n return {\n result,\n scope,\n };\n } catch (error) {\n // Track error\n if (ctx.platform.analytics) {\n await ctx.platform.analytics.track('commit.push.error', {\n scope,\n remote,\n force,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n }\n\n throw new Error(`Failed to push commits: ${error}`);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/rest/handlers/push-handler.ts"],"names":[],"mappings":"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","file":"push-handler.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","import { defineHandler, useConfig, type PluginContextV3, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport {\n COMMIT_CACHE_PREFIX,\n type PushRequest,\n type PushResponse,\n type CommitPluginConfig,\n resolveCommitConfig,\n} from '@kb-labs/commit-contracts';\nimport { pushCommits } from '@kb-labs/commit-core/applier';\nimport { loadPlan, saveToHistory, clearPlan } from '@kb-labs/commit-core/storage';\nimport { resolveScopePath } from './scope-resolver';\n\n/**\n * POST /push handler\n *\n * Pushes commits to the remote repository.\n * After successful push, saves plan to history and clears current plan.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<unknown, PushRequest>): Promise<PushResponse> {\n const { scope = 'root', remote, force } = input.body ?? {};\n const startTime = Date.now();\n\n try {\n // Load the plan before pushing (we'll need it for history)\n const plan = await loadPlan(ctx.cwd, scope);\n\n // Resolve scope to actual directory path\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(ctx.cwd, scope, config.scope?.scopes);\n\n // Push commits (git runs FROM scopeCwd)\n const result = await pushCommits(scopeCwd, { remote, force, scope });\n\n // After successful push, save to history and clear the plan\n if (result.success && plan) {\n // Save to history with push result\n await saveToHistory(ctx.cwd, plan, {\n success: true,\n appliedCommits: [],\n errors: []\n }, scope);\n\n // Clear current plan\n await clearPlan(ctx.cwd, scope);\n\n // Clear applied status cache\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n await ctx.platform.cache.delete(appliedCacheKey);\n }\n\n // Track success/failure\n if (ctx.platform.analytics) {\n if (result.success) {\n await ctx.platform.analytics.track('commit.push.success', {\n scope,\n remote,\n force,\n commitsPushed: plan?.commits.length || 0,\n durationMs: Date.now() - startTime,\n });\n } else {\n await ctx.platform.analytics.track('commit.push.failed', {\n scope,\n remote,\n force,\n error: result.error,\n durationMs: Date.now() - startTime,\n });\n }\n }\n\n return {\n result,\n scope,\n };\n } catch (error) {\n // Track error\n if (ctx.platform.analytics) {\n await ctx.platform.analytics.track('commit.push.error', {\n scope,\n remote,\n force,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n }\n\n rethrowForRest(error);\n }\n },\n});\n"]}
@@ -20,7 +20,7 @@ declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<u
20
20
  type: "feat" | "fix" | "refactor" | "chore" | "docs" | "test" | "build" | "ci" | "perf";
21
21
  id: string;
22
22
  files: string[];
23
- releaseHint: "minor" | "none" | "patch" | "major";
23
+ releaseHint: "none" | "patch" | "minor" | "major";
24
24
  breaking: boolean;
25
25
  scope?: string | undefined;
26
26
  body?: string | undefined;
@@ -1,4 +1,4 @@
1
- import { defineHandler, useLogger, useLLM, useConfig } from '@kb-labs/sdk';
1
+ import { defineHandler, useLogger, useLLM, useConfig, rethrowForRest } from '@kb-labs/sdk';
2
2
  import { resolveCommitConfig, COMMIT_CACHE_PREFIX } from '@kb-labs/commit-contracts';
3
3
  import { loadPlan, savePlan } from '@kb-labs/commit-core/storage';
4
4
  import { getFileSummaries, getFileDiffs } from '@kb-labs/commit-core/analyzer';
@@ -114,7 +114,7 @@ ${fileContext}`;
114
114
  error: error instanceof Error ? error.message : String(error)
115
115
  });
116
116
  }
117
- throw new Error(`Failed to regenerate commit: ${error}`);
117
+ rethrowForRest(error);
118
118
  }
119
119
  }
120
120
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/rest/handlers/regenerate-handler.ts"],"names":[],"mappings":"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","file":"regenerate-handler.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","import { defineHandler, useConfig, type PluginContextV3, type RestInput, useLLM, useLogger } from '@kb-labs/sdk';\nimport type { LLMMessage } from '@kb-labs/sdk';\nimport {\n COMMIT_CACHE_PREFIX,\n type RegenerateCommitRequest,\n type RegenerateCommitResponse,\n type CommitGroup,\n type CommitPluginConfig,\n resolveCommitConfig,\n} from '@kb-labs/commit-contracts';\nimport { loadPlan, savePlan } from '@kb-labs/commit-core/storage';\nimport { getFileSummaries, getFileDiffs } from '@kb-labs/commit-core/analyzer';\nimport { COMMIT_PLAN_TOOL, SYSTEM_PROMPT_WITH_DIFF } from '@kb-labs/commit-core/generator';\nimport { resolveScopePath } from './scope-resolver';\n\n/**\n * POST /regenerate-commit handler\n *\n * Re-analyzes files from a single commit using LLM and replaces it in the plan.\n * Uses Phase 2 approach (with diff context) for best results.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<unknown, RegenerateCommitRequest>): Promise<RegenerateCommitResponse> {\n const logger = useLogger();\n const { scope = 'root', commitId, instruction } = input.body ?? {};\n\n if (!commitId) {\n throw new Error('commitId is required');\n }\n\n const plan = await loadPlan(ctx.cwd, scope);\n if (!plan) {\n throw new Error('No commit plan found. Generate a plan first.');\n }\n\n const commitIndex = plan.commits.findIndex(c => c.id === commitId);\n if (commitIndex === -1) {\n throw new Error(`Commit \"${commitId}\" not found in plan`);\n }\n\n const existingCommit = plan.commits[commitIndex]!;\n const files = existingCommit.files;\n\n if (files.length === 0) {\n throw new Error('Commit has no files to regenerate');\n }\n\n const llm = useLLM();\n if (!llm || !llm.chatWithTools) {\n throw new Error('LLM is not available for regeneration');\n }\n\n try {\n // Resolve scope for file operations\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(ctx.cwd, scope, config.scope?.scopes);\n\n // Get fresh file summaries and diffs\n const summaries = await getFileSummaries(scopeCwd, files);\n const diffs = await getFileDiffs(scopeCwd, files);\n\n // Build prompt for single commit regeneration\n const fileContext = summaries.map(s => {\n const diff = diffs.get(s.path) || '';\n return `File: ${s.path} (${s.status}, +${s.additions}/-${s.deletions})${diff ? `\\nDiff:\\n${diff}` : ''}`;\n }).join('\\n\\n');\n\n const instructionText = instruction\n ? `\\n\\nUser instruction: ${instruction}`\n : '';\n\n const userPrompt = `Analyze these files and generate exactly ONE commit following conventional commit conventions.\nThese files were previously grouped as: ${existingCommit.type}(${existingCommit.scope || ''}): ${existingCommit.message}\n\nRe-analyze them and generate an improved commit message.${instructionText}\n\nFiles to analyze:\n${fileContext}`;\n\n const messages: LLMMessage[] = [\n { role: 'system', content: SYSTEM_PROMPT_WITH_DIFF },\n { role: 'user', content: userPrompt },\n ];\n\n const response = await llm.chatWithTools(messages, {\n tools: [COMMIT_PLAN_TOOL],\n toolChoice: {\n type: 'function',\n function: { name: 'generate_commit_plan' },\n },\n temperature: 0.3,\n });\n\n const toolCall = response.toolCalls?.[0];\n if (!toolCall || toolCall.name !== 'generate_commit_plan') {\n throw new Error('LLM did not call generate_commit_plan tool');\n }\n\n const toolArgs = toolCall.input as { commits: CommitGroup[] };\n\n // Take the first commit from LLM output (we asked for exactly one)\n const regeneratedCommit = toolArgs.commits[0];\n if (!regeneratedCommit) {\n throw new Error('LLM returned no commits');\n }\n\n // Preserve the original commit ID and files\n regeneratedCommit.id = existingCommit.id;\n regeneratedCommit.files = existingCommit.files;\n\n // Replace in plan\n plan.commits[commitIndex] = regeneratedCommit;\n await savePlan(ctx.cwd, plan, scope);\n\n // Regenerated plan is no longer considered applied.\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n await ctx.platform.cache.delete(appliedCacheKey);\n\n await logger.info('[regenerate-handler] Commit regenerated', {\n scope,\n commitId,\n oldMessage: `${existingCommit.type}: ${existingCommit.message}`,\n newMessage: `${regeneratedCommit.type}: ${regeneratedCommit.message}`,\n });\n\n // Track analytics\n if (ctx.platform.analytics) {\n await ctx.platform.analytics.track('commit.regenerate.success', {\n scope,\n commitId,\n hadInstruction: !!instruction,\n filesCount: files.length,\n });\n }\n\n return {\n success: true,\n scope,\n commitId,\n commit: regeneratedCommit,\n };\n } catch (error) {\n if (ctx.platform.analytics) {\n await ctx.platform.analytics.track('commit.regenerate.error', {\n scope,\n commitId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n throw new Error(`Failed to regenerate commit: ${error}`);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/rest/handlers/regenerate-handler.ts"],"names":[],"mappings":";;;;;;;;AAaO,SAAS,gBAAA,CACd,OAAA,EACA,OAAA,GAAkB,MAAA,EAClB,MAAA,EACQ;AACR,EAAA,MAAM,WAAW,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,QAAA,EAAU,IAAA,KAAS,OAAA,KAAY,SAAS,GAAA,GAAM,OAAA,CAAA;AACnE,EAAA,OAAO,YAAA,KAAiB,GAAA,GAAM,OAAA,GAAe,IAAA,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AACzE;;;ACAA,IAAO,6BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAuF;AACzH,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,MAAM,EAAE,QAAQ,MAAA,EAAQ,QAAA,EAAU,aAAY,GAAI,KAAA,CAAM,QAAQ,EAAC;AAEjE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ,CAAA;AACjE,IAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,CAAA,mBAAA,CAAqB,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAC/C,IAAA,MAAM,QAAQ,cAAA,CAAe,KAAA;AAE7B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,MAAM,MAAA,EAAO;AACnB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,CAAI,aAAA,EAAe;AAC9B,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAuC;AAChE,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,UAAA,IAAc,EAAE,CAAA;AACnD,MAAA,MAAM,WAAW,gBAAA,CAAiB,GAAA,CAAI,KAAK,KAAA,EAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAGtE,MAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,QAAA,EAAU,KAAK,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,QAAA,EAAU,KAAK,CAAA;AAGhD,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK;AACrC,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,IAAK,EAAA;AAClC,QAAA,OAAO,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,GAAA,EAAM,CAAA,CAAE,SAAS,CAAA,EAAA,EAAK,CAAA,CAAE,SAAS,IAAI,IAAA,GAAO;AAAA;AAAA,EAAY,IAAI,KAAK,EAAE,CAAA,CAAA;AAAA,MACxG,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAEd,MAAA,MAAM,kBAAkB,WAAA,GACpB;;AAAA,kBAAA,EAAyB,WAAW,CAAA,CAAA,GACpC,EAAA;AAEJ,MAAA,MAAM,UAAA,GAAa,CAAA;AAAA,wCAAA,EACiB,cAAA,CAAe,IAAI,CAAA,CAAA,EAAI,cAAA,CAAe,SAAS,EAAE,CAAA,GAAA,EAAM,eAAe,OAAO;;AAAA,wDAAA,EAE7D,eAAe;;AAAA;AAAA,EAGvE,WAAW,CAAA,CAAA;AAEP,MAAA,MAAM,QAAA,GAAyB;AAAA,QAC7B,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,uBAAA,EAAwB;AAAA,QACnD,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,UAAA;AAAW,OACtC;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,aAAA,CAAc,QAAA,EAAU;AAAA,QACjD,KAAA,EAAO,CAAC,gBAAgB,CAAA;AAAA,QACxB,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU,EAAE,IAAA,EAAM,sBAAA;AAAuB,SAC3C;AAAA,QACA,WAAA,EAAa;AAAA,OACd,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,SAAA,GAAY,CAAC,CAAA;AACvC,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,sBAAA,EAAwB;AACzD,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAC9D;AAEA,MAAA,MAAM,WAAW,QAAA,CAAS,KAAA;AAG1B,MAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AAC5C,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,MAC3C;AAGA,MAAA,iBAAA,CAAkB,KAAK,cAAA,CAAe,EAAA;AACtC,MAAA,iBAAA,CAAkB,QAAQ,cAAA,CAAe,KAAA;AAGzC,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,GAAI,iBAAA;AAC5B,MAAA,MAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AAGnC,MAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,mBAAmB,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA;AACnE,MAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,eAAe,CAAA;AAE/C,MAAA,MAAM,MAAA,CAAO,KAAK,yCAAA,EAA2C;AAAA,QAC3D,KAAA;AAAA,QACA,QAAA;AAAA,QACA,YAAY,CAAA,EAAG,cAAA,CAAe,IAAI,CAAA,EAAA,EAAK,eAAe,OAAO,CAAA,CAAA;AAAA,QAC7D,YAAY,CAAA,EAAG,iBAAA,CAAkB,IAAI,CAAA,EAAA,EAAK,kBAAkB,OAAO,CAAA;AAAA,OACpE,CAAA;AAGD,MAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC1B,QAAA,MAAM,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,2BAAA,EAA6B;AAAA,UAC9D,KAAA;AAAA,UACA,QAAA;AAAA,UACA,cAAA,EAAgB,CAAC,CAAC,WAAA;AAAA,UAClB,YAAY,KAAA,CAAM;AAAA,SACnB,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,KAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACV;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC1B,QAAA,MAAM,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,yBAAA,EAA2B;AAAA,UAC5D,KAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAEA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAC","file":"regenerate-handler.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","import { defineHandler, useConfig, type PluginContextV3, type RestInput, useLLM, useLogger, rethrowForRest } from '@kb-labs/sdk';\nimport type { LLMMessage } from '@kb-labs/sdk';\nimport {\n COMMIT_CACHE_PREFIX,\n type RegenerateCommitRequest,\n type RegenerateCommitResponse,\n type CommitGroup,\n type CommitPluginConfig,\n resolveCommitConfig,\n} from '@kb-labs/commit-contracts';\nimport { loadPlan, savePlan } from '@kb-labs/commit-core/storage';\nimport { getFileSummaries, getFileDiffs } from '@kb-labs/commit-core/analyzer';\nimport { COMMIT_PLAN_TOOL, SYSTEM_PROMPT_WITH_DIFF } from '@kb-labs/commit-core/generator';\nimport { resolveScopePath } from './scope-resolver';\n\n/**\n * POST /regenerate-commit handler\n *\n * Re-analyzes files from a single commit using LLM and replaces it in the plan.\n * Uses Phase 2 approach (with diff context) for best results.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<unknown, RegenerateCommitRequest>): Promise<RegenerateCommitResponse> {\n const logger = useLogger();\n const { scope = 'root', commitId, instruction } = input.body ?? {};\n\n if (!commitId) {\n throw new Error('commitId is required');\n }\n\n const plan = await loadPlan(ctx.cwd, scope);\n if (!plan) {\n throw new Error('No commit plan found. Generate a plan first.');\n }\n\n const commitIndex = plan.commits.findIndex(c => c.id === commitId);\n if (commitIndex === -1) {\n throw new Error(`Commit \"${commitId}\" not found in plan`);\n }\n\n const existingCommit = plan.commits[commitIndex]!;\n const files = existingCommit.files;\n\n if (files.length === 0) {\n throw new Error('Commit has no files to regenerate');\n }\n\n const llm = useLLM();\n if (!llm || !llm.chatWithTools) {\n throw new Error('LLM is not available for regeneration');\n }\n\n try {\n // Resolve scope for file operations\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(ctx.cwd, scope, config.scope?.scopes);\n\n // Get fresh file summaries and diffs\n const summaries = await getFileSummaries(scopeCwd, files);\n const diffs = await getFileDiffs(scopeCwd, files);\n\n // Build prompt for single commit regeneration\n const fileContext = summaries.map(s => {\n const diff = diffs.get(s.path) || '';\n return `File: ${s.path} (${s.status}, +${s.additions}/-${s.deletions})${diff ? `\\nDiff:\\n${diff}` : ''}`;\n }).join('\\n\\n');\n\n const instructionText = instruction\n ? `\\n\\nUser instruction: ${instruction}`\n : '';\n\n const userPrompt = `Analyze these files and generate exactly ONE commit following conventional commit conventions.\nThese files were previously grouped as: ${existingCommit.type}(${existingCommit.scope || ''}): ${existingCommit.message}\n\nRe-analyze them and generate an improved commit message.${instructionText}\n\nFiles to analyze:\n${fileContext}`;\n\n const messages: LLMMessage[] = [\n { role: 'system', content: SYSTEM_PROMPT_WITH_DIFF },\n { role: 'user', content: userPrompt },\n ];\n\n const response = await llm.chatWithTools(messages, {\n tools: [COMMIT_PLAN_TOOL],\n toolChoice: {\n type: 'function',\n function: { name: 'generate_commit_plan' },\n },\n temperature: 0.3,\n });\n\n const toolCall = response.toolCalls?.[0];\n if (!toolCall || toolCall.name !== 'generate_commit_plan') {\n throw new Error('LLM did not call generate_commit_plan tool');\n }\n\n const toolArgs = toolCall.input as { commits: CommitGroup[] };\n\n // Take the first commit from LLM output (we asked for exactly one)\n const regeneratedCommit = toolArgs.commits[0];\n if (!regeneratedCommit) {\n throw new Error('LLM returned no commits');\n }\n\n // Preserve the original commit ID and files\n regeneratedCommit.id = existingCommit.id;\n regeneratedCommit.files = existingCommit.files;\n\n // Replace in plan\n plan.commits[commitIndex] = regeneratedCommit;\n await savePlan(ctx.cwd, plan, scope);\n\n // Regenerated plan is no longer considered applied.\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n await ctx.platform.cache.delete(appliedCacheKey);\n\n await logger.info('[regenerate-handler] Commit regenerated', {\n scope,\n commitId,\n oldMessage: `${existingCommit.type}: ${existingCommit.message}`,\n newMessage: `${regeneratedCommit.type}: ${regeneratedCommit.message}`,\n });\n\n // Track analytics\n if (ctx.platform.analytics) {\n await ctx.platform.analytics.track('commit.regenerate.success', {\n scope,\n commitId,\n hadInstruction: !!instruction,\n filesCount: files.length,\n });\n }\n\n return {\n success: true,\n scope,\n commitId,\n commit: regeneratedCommit,\n };\n } catch (error) {\n if (ctx.platform.analytics) {\n await ctx.platform.analytics.track('commit.regenerate.error', {\n scope,\n commitId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n rethrowForRest(error);\n }\n },\n});\n"]}
@@ -9,8 +9,8 @@ import { RestInput } from '@kb-labs/sdk';
9
9
  declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{
10
10
  scope?: string;
11
11
  }, unknown, unknown>, {
12
- scope: string;
13
12
  message: string;
13
+ scope: string;
14
14
  success: boolean;
15
15
  }>;
16
16
 
@@ -1,4 +1,4 @@
1
- import { defineHandler } from '@kb-labs/sdk';
1
+ import { defineHandler, rethrowForRest } from '@kb-labs/sdk';
2
2
  import { COMMIT_CACHE_PREFIX } from '@kb-labs/commit-contracts';
3
3
  import { clearPlan } from '@kb-labs/commit-core/storage';
4
4
 
@@ -16,11 +16,7 @@ var reset_handler_default = defineHandler({
16
16
  scope
17
17
  };
18
18
  } catch (error) {
19
- return {
20
- success: false,
21
- message: `Failed to delete plan: ${error}`,
22
- scope
23
- };
19
+ rethrowForRest(error);
24
20
  }
25
21
  }
26
22
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/reset-handler.ts"],"names":[],"mappings":";;;;;AAYA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAuE;AACzG,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,MAAA;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC9B,MAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,mBAAmB,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA;AACnE,MAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,eAAe,CAAA;AAE/C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,kCAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,0BAA0B,KAAK,CAAA,CAAA;AAAA,QACxC;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF,CAAC","file":"reset-handler.js","sourcesContent":["import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n COMMIT_CACHE_PREFIX,\n type ResetResponse,\n} from '@kb-labs/commit-contracts';\nimport { clearPlan } from '@kb-labs/commit-core/storage';\n\n/**\n * DELETE /plan handler\n *\n * Deletes the current commit plan.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ scope?: string }, unknown>): Promise<ResetResponse> {\n const scope = input.query?.scope || 'root';\n\n try {\n await clearPlan(ctx.cwd, scope);\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n await ctx.platform.cache.delete(appliedCacheKey);\n\n return {\n success: true,\n message: 'Commit plan deleted successfully',\n scope,\n };\n } catch (error) {\n return {\n success: false,\n message: `Failed to delete plan: ${error}`,\n scope,\n };\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/reset-handler.ts"],"names":[],"mappings":";;;;;AAYA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAuE;AACzG,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,MAAA;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC9B,MAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,mBAAmB,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA;AACnE,MAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,eAAe,CAAA;AAE/C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,kCAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAC","file":"reset-handler.js","sourcesContent":["import { defineHandler, type PluginContextV3, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport {\n COMMIT_CACHE_PREFIX,\n type ResetResponse,\n} from '@kb-labs/commit-contracts';\nimport { clearPlan } from '@kb-labs/commit-core/storage';\n\n/**\n * DELETE /plan handler\n *\n * Deletes the current commit plan.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ scope?: string }, unknown>): Promise<ResetResponse> {\n const scope = input.query?.scope || 'root';\n\n try {\n await clearPlan(ctx.cwd, scope);\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n await ctx.platform.cache.delete(appliedCacheKey);\n\n return {\n success: true,\n message: 'Commit plan deleted successfully',\n scope,\n };\n } catch (error) {\n rethrowForRest(error);\n }\n },\n});\n"]}
@@ -1,21 +1,25 @@
1
- import { defineHandler, useConfig } from '@kb-labs/sdk';
1
+ import { defineHandler, useConfig, rethrowForRest } from '@kb-labs/sdk';
2
2
  import { resolveCommitConfig } from '@kb-labs/commit-contracts';
3
3
 
4
4
  // src/rest/handlers/scopes-handler.ts
5
5
  var scopes_handler_default = defineHandler({
6
6
  async execute(_ctx, _input) {
7
- const fileConfig = await useConfig();
8
- const config = resolveCommitConfig(fileConfig ?? {});
9
- const scopes = config.scope?.scopes ?? [{ id: "root", label: "root", path: "." }];
10
- const defaultId = config.scope?.default ?? scopes[0]?.id ?? "root";
11
- return {
12
- value: defaultId,
13
- options: scopes.map((s) => ({
14
- value: s.id,
15
- label: s.label,
16
- description: s.description
17
- }))
18
- };
7
+ try {
8
+ const fileConfig = await useConfig();
9
+ const config = resolveCommitConfig(fileConfig ?? {});
10
+ const scopes = config.scope?.scopes ?? [{ id: "root", label: "root", path: "." }];
11
+ const defaultId = config.scope?.default ?? scopes[0]?.id ?? "root";
12
+ return {
13
+ value: defaultId,
14
+ options: scopes.map((s) => ({
15
+ value: s.id,
16
+ label: s.label,
17
+ description: s.description
18
+ }))
19
+ };
20
+ } catch (err) {
21
+ rethrowForRest(err);
22
+ }
19
23
  }
20
24
  });
21
25
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/scopes-handler.ts"],"names":[],"mappings":";;;;AASA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,IAAA,EAAuB,MAAA,EAAsC;AACzE,IAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAuC;AAChE,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,UAAA,IAAc,EAAE,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,EAAO,MAAA,IAAU,CAAC,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,CAAA;AAChF,IAAA,MAAM,YAAY,MAAA,CAAO,KAAA,EAAO,WAAW,MAAA,CAAO,CAAC,GAAG,EAAA,IAAM,MAAA;AAE5D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC1B,OAAO,CAAA,CAAE,EAAA;AAAA,QACT,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,aAAa,CAAA,CAAE;AAAA,OACjB,CAAE;AAAA,KACJ;AAAA,EACF;AACF,CAAC","file":"scopes-handler.js","sourcesContent":["import { defineHandler, useConfig, type PluginContextV3, type SelectData } from '@kb-labs/sdk';\nimport { type CommitPluginConfig, resolveCommitConfig } from '@kb-labs/commit-contracts';\n\n/**\n * GET /scopes handler\n *\n * Returns available scopes from kb.config.json (plugins.commit.scope.scopes).\n * Falls back to a single \"root\" scope if not configured.\n */\nexport default defineHandler({\n async execute(_ctx: PluginContextV3, _input: unknown): Promise<SelectData> {\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n\n const scopes = config.scope?.scopes ?? [{ id: 'root', label: 'root', path: '.' }];\n const defaultId = config.scope?.default ?? scopes[0]?.id ?? 'root';\n\n return {\n value: defaultId,\n options: scopes.map((s) => ({\n value: s.id,\n label: s.label,\n description: s.description,\n })),\n };\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scopes-handler.ts"],"names":[],"mappings":";;;;AASA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,IAAA,EAAuB,MAAA,EAAsC;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAuC;AAChE,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,UAAA,IAAc,EAAE,CAAA;AAEnD,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,EAAO,MAAA,IAAU,CAAC,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,CAAA;AAChF,MAAA,MAAM,YAAY,MAAA,CAAO,KAAA,EAAO,WAAW,MAAA,CAAO,CAAC,GAAG,EAAA,IAAM,MAAA;AAE5D,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC1B,OAAO,CAAA,CAAE,EAAA;AAAA,UACT,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,aAAa,CAAA,CAAE;AAAA,SACjB,CAAE;AAAA,OACJ;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"scopes-handler.js","sourcesContent":["import { defineHandler, useConfig, type PluginContextV3, type SelectData, rethrowForRest } from '@kb-labs/sdk';\nimport { type CommitPluginConfig, resolveCommitConfig } from '@kb-labs/commit-contracts';\n\n/**\n * GET /scopes handler\n *\n * Returns available scopes from kb.config.json (plugins.commit.scope.scopes).\n * Falls back to a single \"root\" scope if not configured.\n */\nexport default defineHandler({\n async execute(_ctx: PluginContextV3, _input: unknown): Promise<SelectData> {\n try {\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n\n const scopes = config.scope?.scopes ?? [{ id: 'root', label: 'root', path: '.' }];\n const defaultId = config.scope?.default ?? scopes[0]?.id ?? 'root';\n\n return {\n value: defaultId,\n options: scopes.map((s) => ({\n value: s.id,\n label: s.label,\n description: s.description,\n })),\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1,4 +1,4 @@
1
- import { defineHandler, useConfig } from '@kb-labs/sdk';
1
+ import { defineHandler, useConfig, rethrowForRest } from '@kb-labs/sdk';
2
2
  import { loadPlan } from '@kb-labs/commit-core/storage';
3
3
  import { getGitStatus } from '@kb-labs/commit-core/analyzer';
4
4
  import { COMMIT_CACHE_PREFIX, resolveCommitConfig } from '@kb-labs/commit-contracts';
@@ -74,14 +74,7 @@ var status_handler_default = defineHandler({
74
74
  gitStatus: gitStatus || void 0
75
75
  };
76
76
  } catch (error) {
77
- return {
78
- scope,
79
- hasPlan: false,
80
- planStatus: "idle",
81
- filesChanged: 0,
82
- commitsInPlan: 0,
83
- commitsApplied: 0
84
- };
77
+ rethrowForRest(error);
85
78
  }
86
79
  }
87
80
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/rest/handlers/status-handler.ts"],"names":[],"mappings":"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","file":"status-handler.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","import { defineHandler, useConfig, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { loadPlan } from '@kb-labs/commit-core/storage';\nimport { getGitStatus } from '@kb-labs/commit-core/analyzer';\nimport { COMMIT_CACHE_PREFIX, type StatusResponse, type PlanStatus, type CommitPluginConfig, resolveCommitConfig } from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from './scope-resolver';\n\nconst STATUS_CACHE_TTL = 5000; // 5 seconds\n\n/**\n * GET /status handler\n *\n * Returns current status for a scope according to StatusResponse contract.\n * Uses ctx.platform.cache for git status caching.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ scope?: string }>): Promise<StatusResponse> {\n const scope = input.query?.scope || 'root';\n\n ctx.platform.logger.info(`[status-handler] Fetching status for scope: ${scope}`);\n\n try {\n // Load current plan\n const plan = await loadPlan(ctx.cwd, scope);\n ctx.platform.logger.info(`[status-handler] Plan loaded: ${!!plan}`);\n\n // Get git status (with platform cache)\n let filesChanged = 0;\n let gitStatus: { staged: string[]; unstaged: string[]; untracked: string[] } | null = null;\n const cacheKey = `${COMMIT_CACHE_PREFIX}git-status:${scope}`;\n ctx.platform.logger.info(`[status-handler] Cache key: ${cacheKey}`);\n\n // Try to get from cache\n const cached = await ctx.platform.cache.get(cacheKey);\n ctx.platform.logger.info(`[status-handler] Cache hit: ${!!cached}`);\n\n if (cached !== null && cached !== undefined) {\n // Use cached value\n const cachedData = cached as { count: number; status: { staged: string[]; unstaged: string[]; untracked: string[] } | null };\n filesChanged = cachedData.count;\n gitStatus = cachedData.status;\n } else {\n // Fetch fresh git status\n // Resolve scope to actual directory path (same as files-handler)\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(ctx.cwd, scope, config.scope?.scopes);\n ctx.platform.logger.info(`[status-handler] Resolved scope CWD: ${scopeCwd}`);\n\n gitStatus = await getGitStatus(scopeCwd);\n ctx.platform.logger.info(`[status-handler] Git status fetched - staged: ${gitStatus.staged.length}, unstaged: ${gitStatus.unstaged.length}, untracked: ${gitStatus.untracked.length}`);\n\n filesChanged =\n gitStatus.staged.length +\n gitStatus.unstaged.length +\n gitStatus.untracked.length;\n\n ctx.platform.logger.info(`[status-handler] Total files changed: ${filesChanged}`);\n\n // Cache the result\n await ctx.platform.cache.set(\n cacheKey,\n { count: filesChanged, status: gitStatus },\n STATUS_CACHE_TTL\n );\n }\n\n // Determine plan status\n let planStatus: PlanStatus = 'idle';\n let commitsApplied = 0;\n\n if (plan) {\n // Check if commits were applied (stored in cache after apply)\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n const appliedData = await ctx.platform.cache.get(appliedCacheKey);\n\n if (appliedData) {\n const applied = appliedData as { commitsApplied: number; planCreatedAt?: string };\n // Only trust applied marker if it belongs to the current plan version.\n if (!applied.planCreatedAt || applied.planCreatedAt === plan.createdAt) {\n commitsApplied = applied.commitsApplied;\n planStatus = 'applied';\n } else {\n await ctx.platform.cache.delete(appliedCacheKey);\n planStatus = 'ready';\n }\n } else {\n planStatus = 'ready';\n }\n }\n\n return {\n scope,\n hasPlan: !!plan,\n planStatus,\n filesChanged,\n commitsInPlan: plan?.commits.length || 0,\n commitsApplied,\n planTimestamp: plan?.createdAt,\n gitStatus: gitStatus || undefined,\n };\n } catch (error) {\n return {\n scope,\n hasPlan: false,\n planStatus: 'idle',\n filesChanged: 0,\n commitsInPlan: 0,\n commitsApplied: 0,\n };\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/rest/handlers/status-handler.ts"],"names":[],"mappings":"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","file":"status-handler.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","import { defineHandler, useConfig, type RestInput, type PluginContextV3, rethrowForRest } from '@kb-labs/sdk';\nimport { loadPlan } from '@kb-labs/commit-core/storage';\nimport { getGitStatus } from '@kb-labs/commit-core/analyzer';\nimport { COMMIT_CACHE_PREFIX, type StatusResponse, type PlanStatus, type CommitPluginConfig, resolveCommitConfig } from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from './scope-resolver';\n\nconst STATUS_CACHE_TTL = 5000; // 5 seconds\n\n/**\n * GET /status handler\n *\n * Returns current status for a scope according to StatusResponse contract.\n * Uses ctx.platform.cache for git status caching.\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ scope?: string }>): Promise<StatusResponse> {\n const scope = input.query?.scope || 'root';\n\n ctx.platform.logger.info(`[status-handler] Fetching status for scope: ${scope}`);\n\n try {\n // Load current plan\n const plan = await loadPlan(ctx.cwd, scope);\n ctx.platform.logger.info(`[status-handler] Plan loaded: ${!!plan}`);\n\n // Get git status (with platform cache)\n let filesChanged = 0;\n let gitStatus: { staged: string[]; unstaged: string[]; untracked: string[] } | null = null;\n const cacheKey = `${COMMIT_CACHE_PREFIX}git-status:${scope}`;\n ctx.platform.logger.info(`[status-handler] Cache key: ${cacheKey}`);\n\n // Try to get from cache\n const cached = await ctx.platform.cache.get(cacheKey);\n ctx.platform.logger.info(`[status-handler] Cache hit: ${!!cached}`);\n\n if (cached !== null && cached !== undefined) {\n // Use cached value\n const cachedData = cached as { count: number; status: { staged: string[]; unstaged: string[]; untracked: string[] } | null };\n filesChanged = cachedData.count;\n gitStatus = cachedData.status;\n } else {\n // Fetch fresh git status\n // Resolve scope to actual directory path (same as files-handler)\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(ctx.cwd, scope, config.scope?.scopes);\n ctx.platform.logger.info(`[status-handler] Resolved scope CWD: ${scopeCwd}`);\n\n gitStatus = await getGitStatus(scopeCwd);\n ctx.platform.logger.info(`[status-handler] Git status fetched - staged: ${gitStatus.staged.length}, unstaged: ${gitStatus.unstaged.length}, untracked: ${gitStatus.untracked.length}`);\n\n filesChanged =\n gitStatus.staged.length +\n gitStatus.unstaged.length +\n gitStatus.untracked.length;\n\n ctx.platform.logger.info(`[status-handler] Total files changed: ${filesChanged}`);\n\n // Cache the result\n await ctx.platform.cache.set(\n cacheKey,\n { count: filesChanged, status: gitStatus },\n STATUS_CACHE_TTL\n );\n }\n\n // Determine plan status\n let planStatus: PlanStatus = 'idle';\n let commitsApplied = 0;\n\n if (plan) {\n // Check if commits were applied (stored in cache after apply)\n const appliedCacheKey = `${COMMIT_CACHE_PREFIX}plan-applied:${scope}`;\n const appliedData = await ctx.platform.cache.get(appliedCacheKey);\n\n if (appliedData) {\n const applied = appliedData as { commitsApplied: number; planCreatedAt?: string };\n // Only trust applied marker if it belongs to the current plan version.\n if (!applied.planCreatedAt || applied.planCreatedAt === plan.createdAt) {\n commitsApplied = applied.commitsApplied;\n planStatus = 'applied';\n } else {\n await ctx.platform.cache.delete(appliedCacheKey);\n planStatus = 'ready';\n }\n } else {\n planStatus = 'ready';\n }\n }\n\n return {\n scope,\n hasPlan: !!plan,\n planStatus,\n filesChanged,\n commitsInPlan: plan?.commits.length || 0,\n commitsApplied,\n planTimestamp: plan?.createdAt,\n gitStatus: gitStatus || undefined,\n };\n } catch (error) {\n rethrowForRest(error);\n }\n },\n});\n"]}
@@ -14,8 +14,8 @@ declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<u
14
14
  }, unknown>, {
15
15
  scope: string;
16
16
  summary: string;
17
- file?: string | undefined;
18
17
  tokensUsed?: number | undefined;
18
+ file?: string | undefined;
19
19
  }>;
20
20
 
21
21
  export { _default as default };
@@ -1,4 +1,4 @@
1
- import { defineHandler, useLogger, useLLM, useConfig } from '@kb-labs/sdk';
1
+ import { defineHandler, useLogger, useLLM, useConfig, rethrowForRest } from '@kb-labs/sdk';
2
2
  import { resolveCommitConfig } from '@kb-labs/commit-contracts';
3
3
  import { getFileDiff, getGitStatus, getAllChangedFiles } from '@kb-labs/commit-core/analyzer';
4
4
  import * as path from 'path';
@@ -96,7 +96,7 @@ Keep it concise and at a high level.`;
96
96
  };
97
97
  } catch (error) {
98
98
  logger.error("[summarize-handler] Error", error);
99
- throw new Error(`Failed to summarize changes: ${error}`);
99
+ rethrowForRest(error);
100
100
  }
101
101
  }
102
102
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/rest/handlers/summarize-handler.ts"],"names":[],"mappings":"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","file":"summarize-handler.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","import { defineHandler, useConfig, type PluginContextV3, type RestInput, useLogger, useLLM } from '@kb-labs/sdk';\nimport { type SummarizeRequest, type SummarizeResponse, type CommitPluginConfig, resolveCommitConfig } from '@kb-labs/commit-contracts';\nimport { getFileDiff, getAllChangedFiles, getGitStatus } from '@kb-labs/commit-core/analyzer';\nimport { resolveScopePath } from './scope-resolver';\n\n/**\n * POST /summarize handler\n *\n * Summarizes changes using LLM. Can summarize:\n * - All changes in scope (if no file specified)\n * - Specific file changes (if file specified)\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<unknown, SummarizeRequest>): Promise<SummarizeResponse> {\n const logger = useLogger();\n const llm = useLLM();\n\n if (!llm) {\n throw new Error('LLM is not available. Please configure an LLM adapter.');\n }\n\n const { scope = 'root', file } = input.body || {};\n\n logger.info('[summarize-handler] Request received', { scope, file });\n\n try {\n // Resolve scope to actual directory path\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(ctx.cwd, scope, config.scope?.scopes);\n logger.info('[summarize-handler] Resolved scope', { scope, scopeCwd });\n\n let prompt: string;\n\n if (file) {\n // Summarize specific file\n logger.info('[summarize-handler] Summarizing file', { file });\n\n // Get file diff (git runs FROM scopeCwd)\n const diffResult = await getFileDiff(scopeCwd, file);\n\n prompt = `Analyze this git diff and provide a concise summary of what changed in this file.\n\nFile: ${file}\n\nDiff:\n\\`\\`\\`diff\n${diffResult.diff}\n\\`\\`\\`\n\nProvide a 2-3 sentence summary focusing on:\n- What was added, modified, or removed\n- The purpose/intent of the changes\n- Any notable impacts\n\nKeep it concise and technical.`;\n } else {\n // Summarize all changes\n logger.info('[summarize-handler] Summarizing all changes');\n\n // Get git status (git runs FROM scopeCwd)\n const gitStatus = await getGitStatus(scopeCwd);\n const files = getAllChangedFiles(gitStatus);\n\n if (files.length === 0) {\n return {\n scope,\n summary: 'No changes detected in this scope.',\n };\n }\n\n // Get diffs for all files (limit to first 10 to avoid token overflow)\n const filesToSummarize = files.slice(0, 10);\n const diffs = await Promise.all(\n filesToSummarize.map(async (f) => {\n const diff = await getFileDiff(scopeCwd, f);\n return { file: f, diff: diff.diff, additions: diff.additions, deletions: diff.deletions };\n })\n );\n\n const diffsText = diffs\n .map((d) => `### ${d.file} (+${d.additions} -${d.deletions})\\n\\`\\`\\`diff\\n${d.diff}\\n\\`\\`\\``)\n .join('\\n\\n');\n\n prompt = `Analyze these git diffs and provide a high-level summary of all changes in this scope.\n\nTotal files changed: ${files.length}\n${files.length > 10 ? `(Showing first 10 files)` : ''}\n\n${diffsText}\n\nProvide a 3-5 sentence summary covering:\n- Overall theme of the changes\n- Key features added, bugs fixed, or refactorings done\n- Any notable architectural changes\n\nKeep it concise and at a high level.`;\n }\n\n // Call LLM\n logger.info('[summarize-handler] Calling LLM');\n const result = await llm.complete(prompt, {\n systemPrompt: 'You are a technical code reviewer. Provide concise, accurate summaries of code changes.',\n temperature: 0.3,\n maxTokens: 500,\n });\n\n logger.info('[summarize-handler] LLM response received', {\n tokensUsed: result.usage.promptTokens + result.usage.completionTokens,\n });\n\n return {\n scope,\n file,\n summary: result.content.trim(),\n tokensUsed: result.usage.promptTokens + result.usage.completionTokens,\n };\n } catch (error) {\n logger.error('[summarize-handler] Error', error as Error);\n throw new Error(`Failed to summarize changes: ${error}`);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/rest/handlers/summarize-handler.ts"],"names":[],"mappings":"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","file":"summarize-handler.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","import { defineHandler, useConfig, type PluginContextV3, type RestInput, useLogger, useLLM, rethrowForRest } from '@kb-labs/sdk';\nimport { type SummarizeRequest, type SummarizeResponse, type CommitPluginConfig, resolveCommitConfig } from '@kb-labs/commit-contracts';\nimport { getFileDiff, getAllChangedFiles, getGitStatus } from '@kb-labs/commit-core/analyzer';\nimport { resolveScopePath } from './scope-resolver';\n\n/**\n * POST /summarize handler\n *\n * Summarizes changes using LLM. Can summarize:\n * - All changes in scope (if no file specified)\n * - Specific file changes (if file specified)\n */\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<unknown, SummarizeRequest>): Promise<SummarizeResponse> {\n const logger = useLogger();\n const llm = useLLM();\n\n if (!llm) {\n throw new Error('LLM is not available. Please configure an LLM adapter.');\n }\n\n const { scope = 'root', file } = input.body || {};\n\n logger.info('[summarize-handler] Request received', { scope, file });\n\n try {\n // Resolve scope to actual directory path\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(ctx.cwd, scope, config.scope?.scopes);\n logger.info('[summarize-handler] Resolved scope', { scope, scopeCwd });\n\n let prompt: string;\n\n if (file) {\n // Summarize specific file\n logger.info('[summarize-handler] Summarizing file', { file });\n\n // Get file diff (git runs FROM scopeCwd)\n const diffResult = await getFileDiff(scopeCwd, file);\n\n prompt = `Analyze this git diff and provide a concise summary of what changed in this file.\n\nFile: ${file}\n\nDiff:\n\\`\\`\\`diff\n${diffResult.diff}\n\\`\\`\\`\n\nProvide a 2-3 sentence summary focusing on:\n- What was added, modified, or removed\n- The purpose/intent of the changes\n- Any notable impacts\n\nKeep it concise and technical.`;\n } else {\n // Summarize all changes\n logger.info('[summarize-handler] Summarizing all changes');\n\n // Get git status (git runs FROM scopeCwd)\n const gitStatus = await getGitStatus(scopeCwd);\n const files = getAllChangedFiles(gitStatus);\n\n if (files.length === 0) {\n return {\n scope,\n summary: 'No changes detected in this scope.',\n };\n }\n\n // Get diffs for all files (limit to first 10 to avoid token overflow)\n const filesToSummarize = files.slice(0, 10);\n const diffs = await Promise.all(\n filesToSummarize.map(async (f) => {\n const diff = await getFileDiff(scopeCwd, f);\n return { file: f, diff: diff.diff, additions: diff.additions, deletions: diff.deletions };\n })\n );\n\n const diffsText = diffs\n .map((d) => `### ${d.file} (+${d.additions} -${d.deletions})\\n\\`\\`\\`diff\\n${d.diff}\\n\\`\\`\\``)\n .join('\\n\\n');\n\n prompt = `Analyze these git diffs and provide a high-level summary of all changes in this scope.\n\nTotal files changed: ${files.length}\n${files.length > 10 ? `(Showing first 10 files)` : ''}\n\n${diffsText}\n\nProvide a 3-5 sentence summary covering:\n- Overall theme of the changes\n- Key features added, bugs fixed, or refactorings done\n- Any notable architectural changes\n\nKeep it concise and at a high level.`;\n }\n\n // Call LLM\n logger.info('[summarize-handler] Calling LLM');\n const result = await llm.complete(prompt, {\n systemPrompt: 'You are a technical code reviewer. Provide concise, accurate summaries of code changes.',\n temperature: 0.3,\n maxTokens: 500,\n });\n\n logger.info('[summarize-handler] LLM response received', {\n tokensUsed: result.usage.promptTokens + result.usage.completionTokens,\n });\n\n return {\n scope,\n file,\n summary: result.content.trim(),\n tokensUsed: result.usage.promptTokens + result.usage.completionTokens,\n };\n } catch (error) {\n logger.error('[summarize-handler] Error', error as Error);\n rethrowForRest(error);\n }\n },\n});\n"]}