@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 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/cli/commands/run.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;;;ACwBA,IAAO,cAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,eAAA;AAAA,EACJ,WAAA,EAAa,2CAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAqC;AACvE,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,MAAM,MAAA,EAAO;AACnB,MAAA,MAAM,GAAA,GAAO,MAAM,YAAA,CAAa,GAAA,CAAI,GAAA,IAAO,QAAQ,GAAA,EAAK,CAAA,IAAM,OAAA,CAAQ,GAAA,EAAI;AAG1E,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAuC;AAGhE,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAEvC,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,UAAA,IAAc,IAAI,GAAG,CAAA;AAGxD,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,KAAA;AAC7B,MAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,IAAS,MAAA,CAAO,OAAO,OAAA,IAAW,MAAA;AAC/D,MAAA,MAAM,WAAW,gBAAA,CAAiB,GAAA,EAAK,cAAA,EAAgB,MAAA,CAAO,OAAO,MAAM,CAAA;AAC3E,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA;AACnC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAW,CAAA,IAAK,KAAA;AACvC,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,IAAQ,KAAA;AACjC,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,eAAe,CAAA,IAAK,KAAA;AAC/C,MAAA,MAAM,WAAA,GAAc,MAAM,GAAA,IAAO,KAAA;AAGjC,MAAA,MAAM,YAAA,GAAe,UAAU,wBAAwB,CAAA;AACvD,MAAA,YAAA,CAAa,KAAA,EAAM;AACnB,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,QAAQ,CAAA;AAE1C,MAAA,IAAI,CAAC,UAAA,CAAW,MAAM,CAAA,EAAG;AACvB,QAAA,YAAA,CAAa,IAAA,EAAK;AAClB,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,sBAAsB,CAAA;AACrC,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AACA,MAAA,YAAA,CAAa,QAAQ,qBAAqB,CAAA;AAG1C,MAAA,MAAM,aAAA,GAAgB,UAAU,sBAAsB,CAAA;AACtD,MAAA,aAAA,CAAc,KAAA,EAAM;AAGpB,MAAA,MAAM,cACJ,GAAA,IAAO,MAAA,CAAO,IAAI,OAAA,GACd,OAAO,QAAgB,OAAA,KAAkF;AACvG,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ;AAAA,UACxC,GAAG,OAAA;AAAA,UACH,WAAA,EAAa,OAAA,EAAS,WAAA,IAAe,MAAA,CAAO,GAAA,CAAI,WAAA;AAAA,UAChD,SAAA,EAAW,OAAA,EAAS,SAAA,IAAa,MAAA,CAAO,GAAA,CAAI;AAAA,SAC7C,CAAA;AACD,QAAA,OAAO;AAAA,UACL,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAA,EAAY,OAAO,KAAA,GAAQ,MAAA,CAAO,MAAM,YAAA,GAAe,MAAA,CAAO,MAAM,gBAAA,GAAmB;AAAA,SACzF;AAAA,MACF,CAAA,GACA,MAAA;AAEN,MAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB;AAAA,QACpC,GAAA,EAAK,QAAA;AAAA,QACL,WAAA;AAAA,QACA,MAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA,EAAY,CAAC,OAAA,KAAY,aAAA,CAAc,OAAO,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,QAC/D,eAAA,EAAiB,MAAM,aAAA,CAAc,IAAA,EAAK;AAAA,QAC1C,gBAAA,EAAkB,MAAM,aAAA,CAAc,KAAA;AAAM,OAC7C,CAAA;AAGD,MAAA,MAAM,QAAA,CAAS,KAAK,IAAI,CAAA;AAGxB,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAA,2BAAA,EAA8B,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,UAAA,CAAY,CAAA;AAGnF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAChD,UAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AACnD,UAAA,OAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,SAAA,CAAA;AAAA,QAC1E,CAAC,CAAA;AAED,QAAA,MAAM,YAAA,GAAyB;AAAA,UAC7B,CAAA,OAAA,EAAU,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,UAClC,CAAA,SAAA,EAAY,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,CAAA;AAAA,UACtC;AAAA,SACF;AAEA,QAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,SAAA,GAAY,qBAAA,GAAwB,SAAA;AACnE,UAAA,YAAA,CAAa,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAE,CAAA;AACpC,UAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,YAAA,YAAA,CAAa,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,UACzD;AAAA,QACF,CAAA,MAAO;AACL,UAAA,YAAA,CAAa,KAAK,uBAAuB,CAAA;AAAA,QAC3C;AAEA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE5B,QAAA,GAAA,CAAI,EAAA,EAAI,UAAU,qCAAA,EAAuC;AAAA,UACvD,KAAA,EAAO,sBAAA;AAAA,UACP,QAAA,EAAU;AAAA,YACR,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,YAAA,EAAa;AAAA,YACzC,EAAE,MAAA,EAAQ,iBAAA,EAAmB,KAAA,EAAO,YAAA;AAAa,WACnD;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,CAAA;AAAA,UACV,MAAA,EAAQ;AAAA,YACN,IAAA;AAAA,YACA,OAAA,EAAS,KAAA;AAAA,YACT,MAAA,EAAQ,KAAA;AAAA,YACR,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAChC,IAAI,CAAA,CAAE,EAAA;AAAA,cACN,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAA,EAAK,EAAE,OAAO,CAAA;AAAA,aAClE,CAAE;AAAA,WACJ;AAAA,UACA,IAAA,EAAM;AAAA,YACJ;AAAA;AACF,SACF;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,UAAU,qBAAqB,CAAA;AACnD,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA;AAExD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAA,WAAA,CAAY,KAAK,yBAAyB,CAAA;AAC1C,QAAA,KAAA,MAAW,KAAA,IAAS,YAAY,MAAA,EAAQ;AACtC,UAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,QAC9B;AACA,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAGA,MAAA,MAAM,aAAA,CAAc,GAAA,EAAK,IAAA,EAAM,WAAW,CAAA;AAC1C,MAAA,MAAM,UAAU,GAAG,CAAA;AAEnB,MAAA,WAAA,CAAY,OAAA,CAAQ,CAAA,QAAA,EAAW,WAAA,CAAY,cAAA,CAAe,MAAM,CAAA,UAAA,CAAY,CAAA;AAG5E,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,UAAA,GAAa,UAAU,oBAAoB,CAAA;AACjD,QAAA,UAAA,CAAW,KAAA,EAAM;AACjB,QAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,QAAQ,CAAA;AAE7C,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,MAAA,GAAS,IAAA;AACT,UAAA,UAAA,CAAW,QAAQ,CAAA,UAAA,EAAa,UAAA,CAAW,MAAM,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAAA,QAC1E,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,gBAAA,EAAmB,UAAA,CAAW,KAAK,CAAA,CAAE,CAAA;AAAA,QACvD;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAA0B;AAAA,QAC9B,IAAA;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,MAAA;AAAA,QACA,OAAA,EAAS,WAAA,CAAY,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9C,IAAI,CAAA,CAAE,OAAA;AAAA,UACN,KAAK,CAAA,CAAE,GAAA;AAAA,UACP,SAAS,CAAA,CAAE;AAAA,SACb,CAAE;AAAA,OACJ;AAEA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,MAAM,CAAA;AAAA,MACvB,CAAA,MAAO;AAEL,QAAA,MAAM,YAAA,GAAe,WAAA,CAAY,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM;AACzD,UAAA,MAAM,QAAA,GAAW,CAAA,CAAE,GAAA,CAAI,SAAA,CAAU,GAAG,CAAC,CAAA;AACrC,UAAA,MAAM,YAAY,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA;AACzC,UAAA,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAAA,QACnC,CAAC,CAAA;AAGD,QAAA,MAAM,YAAA,GAAyB;AAAA,UAC7B,CAAA,SAAA,EAAY,WAAA,CAAY,cAAA,CAAe,MAAM,CAAA,CAAA;AAAA,UAC7C,CAAA,QAAA,EAAW,MAAA,GAAS,KAAA,GAAQ,IAAI,CAAA;AAAA,SAClC;AAEA,QAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,SAAA,GAAY,SAAA,GAAY,SAAA;AACvD,UAAA,YAAA,CAAa,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAE,CAAA;AACpC,UAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,YAAA,YAAA,CAAa,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,UACzD;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE5B,QAAA,GAAA,CAAI,EAAA,EAAI,UAAU,8BAAA,EAAgC;AAAA,UAChD,KAAA,EAAO,YAAA;AAAA,UACP,QAAA,EAAU;AAAA,YACR,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,YAAA,EAAa;AAAA,YACzC,EAAE,MAAA,EAAQ,iBAAA,EAAmB,KAAA,EAAO,YAAA;AAAa,WACnD;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AACvB,OACF;AAAA,IACF;AAAA;AAEJ,CAAC","file":"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 onPauseProgress: () => analyzeLoader.stop(),\n onResumeProgress: () => analyzeLoader.start(),\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"]}
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 handleError,\n type PluginContextV3,\n type CLIInput,\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\ntype RunResult = {\n exitCode: number;\n result?: CommitRunOutput;\n meta?: Record<string, unknown>;\n};\n\nasync function resolveContext(ctx: PluginContextV3, flags: CommitFlags) {\n const llm = useLLM();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const env = commitEnv.parse(ctx.runtime);\n const config = resolveCommitConfig(fileConfig ?? {}, env);\n const effectiveScope = flags.scope ?? config.scope?.default ?? 'root';\n const scopeCwd = resolveScopePath(cwd, effectiveScope, config.scope?.scopes);\n\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 return { cwd, config, effectiveScope, scopeCwd, llmComplete };\n}\n\nexport default defineCommand({\n id: 'commit:commit',\n description: 'Generate and apply commits (default flow)',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<CommitFlags>) {\n const flags = input.flags;\n const { effectiveScope, scopeCwd, llmComplete, config } = await resolveContext(ctx, flags);\n\n const status = await getGitStatus(scopeCwd);\n if (!hasChanges(status)) {\n return {\n summary: 'No changes to commit',\n operations: [],\n };\n }\n\n const plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets: flags['allow-secrets'] ?? false,\n autoConfirm: flags.yes ?? false,\n });\n\n return {\n summary: `Generate and apply ${plan.commits.length} commit(s) in scope \"${effectiveScope}\"`,\n operations: plan.commits.map(c => ({\n type: 'create' as const,\n resource: 'git-commit',\n details: {\n message: `${c.type}${c.scope ? `(${c.scope})` : ''}: ${c.message}`,\n files: c.files.length,\n },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<CommitFlags>): Promise<RunResult> {\n const startTime = Date.now();\n const flags = input.flags;\n const { cwd, effectiveScope, scopeCwd, llmComplete, config } = await resolveContext(ctx, flags);\n const withPush = flags['with-push'] ?? false;\n const outputJson = flags.json ?? false;\n\n // 1. Check for changes\n const statusLoader = useLoader('Checking git status...');\n statusLoader.start();\n let status;\n try {\n status = await getGitStatus(scopeCwd);\n } catch (err) {\n statusLoader.fail('Failed to check git status');\n handleError(ctx, err, outputJson);\n return { exitCode: 1 };\n }\n\n if (!hasChanges(status)) {\n statusLoader.stop();\n ctx.ui?.warn?.('No changes to commit');\n return { exitCode: 1 };\n }\n statusLoader.succeed('Git status analyzed');\n\n // 2. Generate plan\n const analyzeLoader = useLoader('Analyzing changes...');\n analyzeLoader.start();\n\n const plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets: flags['allow-secrets'] ?? false,\n autoConfirm: flags.yes ?? false,\n onProgress: (message) => analyzeLoader.update({ text: message }),\n onPauseProgress: () => analyzeLoader.stop(),\n onResumeProgress: () => analyzeLoader.start(),\n });\n\n await savePlan(cwd, plan);\n analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);\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 if (outputJson) {\n ctx.ui?.json?.({ ok: false, error: { code: 'APPLY_FAILED', message: applyResult.errors.join('; ') } });\n } else {\n ctx.ui?.error?.('Failed to apply commits', {\n hint: 'Check git status and resolve conflicts manually',\n cause: applyResult.errors.join('; '),\n });\n }\n return { exitCode: 1 };\n }\n\n await saveToHistory(cwd, plan, applyResult);\n await clearPlan(cwd);\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 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 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 const summaryItems: string[] = [\n `Commits: ${applyResult.appliedCommits.length}`,\n `Pushed: ${pushed ? 'Yes' : 'No'}`,\n `Scope: ${effectiveScope}`,\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 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: { timing: Date.now() - startTime },\n };\n },\n },\n});\n"]}
package/dist/index.d.ts CHANGED
@@ -2,4 +2,4 @@ export { ApplyFlags, EmptyFlags, GenerateFlags, JsonOnlyFlags, PushFlags, RunFla
2
2
  export { default as setup } from './lifecycle/setup.js';
3
3
  export { default as manifest } from './manifest.js';
4
4
  import '@kb-labs/commit-contracts';
5
- import '@kb-labs/perm-presets';
5
+ import '@kb-labs/plugin-contracts';
package/dist/index.js CHANGED
@@ -180,7 +180,7 @@ var manifest = {
180
180
  configSection: "commit",
181
181
  display: {
182
182
  name: "Commit Generator",
183
- description: "AI-powered commit generation with conventional commit support.",
183
+ description: "AI-powered conventional commit generation",
184
184
  tags: ["commit", "git", "ai", "conventional-commits"]
185
185
  },
186
186
  // Platform requirements (LLM is optional but preferred)
@@ -203,16 +203,22 @@ var manifest = {
203
203
  // },
204
204
  // V3: cli wrapper with commands array
205
205
  cli: {
206
+ groupMeta: [
207
+ {
208
+ path: "commit",
209
+ describe: "AI-powered conventional commit generation."
210
+ }
211
+ ],
206
212
  commands: [
207
213
  // Main command: commit (default flow)
208
214
  {
209
- id: "commit",
210
- group: "commit",
215
+ path: "commit",
216
+ category: "Pipeline",
211
217
  describe: "Generate and apply commits (default flow).",
218
+ operationType: "execute",
212
219
  longDescription: "Analyzes changes, generates commit plan with LLM, applies commits locally. Use --dry-run to preview without applying, --with-push to push after applying.",
213
220
  // ✅ V3: handler with #default suffix
214
221
  handler: "./cli/commands/run.js#default",
215
- handlerPath: "./cli/commands/run.js",
216
222
  flags: defineCommandFlags(runFlags),
217
223
  examples: [
218
224
  "kb commit commit",
@@ -223,12 +229,12 @@ var manifest = {
223
229
  },
224
230
  // commit:generate - Generate commit plan
225
231
  {
226
- id: "generate",
227
- group: "commit",
232
+ path: "commit generate",
233
+ category: "Pipeline",
228
234
  describe: "Generate commit plan from git changes.",
235
+ operationType: "execute",
229
236
  longDescription: "Analyzes staged and unstaged changes using git diff, then uses LLM to group related changes and generate conventional commit messages.",
230
237
  handler: "./cli/commands/generate.js#default",
231
- handlerPath: "./cli/commands/generate.js",
232
238
  flags: defineCommandFlags(generateFlags),
233
239
  examples: [
234
240
  "kb commit generate",
@@ -238,12 +244,12 @@ var manifest = {
238
244
  },
239
245
  // commit:apply - Apply commit plan
240
246
  {
241
- id: "apply",
242
- group: "commit",
247
+ path: "commit apply",
248
+ category: "Pipeline",
243
249
  describe: "Apply current commit plan (create local commits).",
250
+ operationType: "mutate",
244
251
  longDescription: "Creates git commits according to the current plan. Checks for staleness (working tree changes since plan generation) unless --force is used.",
245
252
  handler: "./cli/commands/apply.js#default",
246
- handlerPath: "./cli/commands/apply.js",
247
253
  flags: defineCommandFlags(applyFlags),
248
254
  examples: [
249
255
  "kb commit apply",
@@ -252,12 +258,12 @@ var manifest = {
252
258
  },
253
259
  // commit:push - Push commits
254
260
  {
255
- id: "push",
256
- group: "commit",
261
+ path: "commit push",
262
+ category: "Pipeline",
257
263
  describe: "Push commits to remote repository.",
264
+ operationType: "execute",
258
265
  longDescription: "Pushes local commits to the remote. Refuses force push to protected branches (main, master) by default.",
259
266
  handler: "./cli/commands/push.js#default",
260
- handlerPath: "./cli/commands/push.js",
261
267
  flags: defineCommandFlags(pushFlags),
262
268
  examples: [
263
269
  "kb commit push"
@@ -265,12 +271,12 @@ var manifest = {
265
271
  },
266
272
  // commit:open - Show current plan
267
273
  {
268
- id: "open",
269
- group: "commit",
274
+ path: "commit open",
275
+ category: "Plan",
270
276
  describe: "Show current commit plan.",
277
+ operationType: "read",
271
278
  longDescription: "Displays the current commit plan if one exists.",
272
279
  handler: "./cli/commands/open.js#default",
273
- handlerPath: "./cli/commands/open.js",
274
280
  flags: defineCommandFlags(jsonOnlyFlags),
275
281
  examples: [
276
282
  "kb commit open",
@@ -279,12 +285,12 @@ var manifest = {
279
285
  },
280
286
  // commit:reset - Clear current plan
281
287
  {
282
- id: "reset",
283
- group: "commit",
288
+ path: "commit reset",
289
+ category: "Plan",
284
290
  describe: "Clear current commit plan.",
291
+ operationType: "mutate",
285
292
  longDescription: "Removes the current commit plan from storage.",
286
293
  handler: "./cli/commands/reset.js#default",
287
- handlerPath: "./cli/commands/reset.js",
288
294
  flags: defineCommandFlags(emptyFlags),
289
295
  examples: [
290
296
  "kb commit reset"
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/flags.ts","../src/lifecycle/setup.ts","../src/manifest.ts"],"names":[],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyaA,SAAA,EAAW;AAAA,IACT;AAAA,MACE,EAAA,EAAI,kBAAA;AAAA,MACJ,YAAA,EAAc,8BAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,EAAA,EAAI,oBAAA;AAAA,MACJ,YAAA,EAAc,gCAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf;AAEJ","file":"index.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n","/**\n * Setup handler for commit plugin\n * Initializes .kb/commit/ directory structure and config\n */\n\nimport { defaultCommitConfig } from '@kb-labs/commit-contracts';\n\nconst COMMIT_DIR = '.kb/commit';\n\n/**\n * Plugin setup configuration\n *\n * Uses CommitPluginConfig from contracts as single source of truth.\n */\nexport const setup = {\n files: [\n {\n path: `${COMMIT_DIR}/README.md`,\n content: [\n '# Commit Plugin Workspace',\n '',\n 'This directory contains commit plugin data:',\n '',\n '- `current/` - Current commit plan (generated, not committed)',\n '- `history/` - Applied commit plans history',\n '',\n '## Configuration',\n '',\n 'Plugin configuration is stored in `kb.config.json` under `plugins.commit`.',\n '',\n '### Environment Variables',\n '',\n '| Variable | Description | Default |',\n '|----------|-------------|---------|',\n '| `KB_COMMIT_LLM_ENABLED` | Enable/disable LLM | `true` |',\n '| `KB_COMMIT_LLM_TEMPERATURE` | LLM temperature (0-1) | `0.3` |',\n '| `KB_COMMIT_LLM_MAX_TOKENS` | Max tokens for LLM | `2000` |',\n '| `KB_COMMIT_STORAGE_DIR` | Storage directory | `.kb/commit` |',\n '| `KB_COMMIT_AUTO_STAGE` | Auto-stage changes | `false` |',\n '',\n '## Commands',\n '',\n '```bash',\n '# Full flow: generate → apply',\n 'kb commit',\n '',\n '# Generate plan only',\n 'kb commit:generate',\n '',\n '# Apply current plan',\n 'kb commit:apply',\n '',\n '# View current plan',\n 'kb commit:open',\n '',\n '# Reset current plan',\n 'kb commit:reset',\n '',\n '# Push commits',\n 'kb commit:push',\n '```',\n '',\n 'Re-run `kb commit setup --force` to regenerate defaults.',\n ].join('\\n') + '\\n',\n description: 'README for commit plugin workspace',\n },\n ],\n\n config: [\n {\n pointer: 'plugins.commit',\n value: defaultCommitConfig,\n },\n ],\n\n scripts: [\n {\n name: 'commit',\n command: 'kb commit',\n description: 'Generate and apply commits',\n },\n {\n name: 'commit:generate',\n command: 'kb commit:generate',\n description: 'Generate commit plan from changes',\n },\n ],\n\n gitignore: [\n '.kb/commit/current/',\n '.kb/commit/history/',\n ],\n\n notes: [\n 'Run `kb commit` to analyze changes and generate commit plan.',\n 'Set KB_COMMIT_LLM_ENABLED=false to use heuristics only.',\n 'Use `kb commit:open` to view current plan before applying.',\n ],\n};\n\n/**\n * Setup handler function (for manifest registration)\n */\nexport async function run() {\n return {\n message: 'Commit plugin setup completed. Try `kb commit` to generate commits!',\n ...setup,\n };\n}\n\nexport default run;\n","/**\n * KB Labs Commit Plugin - Manifest V3\n *\n * Migration from V2 to V3 following best practices from V3-MIGRATION-GUIDE.md\n *\n * Key changes:\n * - Schema: kb.plugin/3\n * - Commands use handler#default suffix\n * - Commands have handlerPath field\n * - All imports from @kb-labs/sdk\n */\n\nimport {\n defineCommandFlags,\n combinePermissions,\n gitWorkflowPreset,\n kbPlatformPreset,\n} from '@kb-labs/sdk';\nimport {\n COMMIT_ENV_VARS,\n COMMIT_BASE_PATH,\n COMMIT_ROUTES,\n COMMIT_CACHE_PREFIX,\n} from '@kb-labs/commit-contracts';\nimport {\n runFlags,\n generateFlags,\n applyFlags,\n pushFlags,\n jsonOnlyFlags,\n emptyFlags,\n} from './cli/commands/flags';\n\n/**\n * Build permissions using presets:\n * - gitWorkflow: HOME, USER, GIT_*, SSH_* for git operations\n * - kbPlatform: KB_* env vars and .kb/ directory\n * - Custom: COMMIT_ENV_VARS, quotas, platform services (llm, cache)\n *\n * Note: LLM access goes through platform services, no direct API keys needed.\n */\nconst pluginPermissions = combinePermissions()\n .with(gitWorkflowPreset)\n .with(kbPlatformPreset)\n .withEnv([...COMMIT_ENV_VARS])\n .withFs({\n mode: 'readWrite',\n allow: ['.kb/commit/**'],\n })\n .withPlatform({\n llm: true, // Full LLM access for commit generation\n cache: [COMMIT_CACHE_PREFIX], // Cache namespace prefix from contracts\n analytics: true, // Track commit generation events\n })\n .withQuotas({\n timeoutMs: 600000, // 10 min for LLM\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/commit',\n version: '0.1.0',\n configSection: 'commit',\n\n display: {\n name: 'Commit Generator',\n description: 'AI-powered commit generation with conventional commit support.',\n tags: ['commit', 'git', 'ai', 'conventional-commits'],\n },\n\n // Platform requirements (LLM is optional but preferred)\n platform: {\n requires: ['storage', 'cache'],\n optional: ['llm', 'analytics', 'logger'],\n },\n\n // TODO: Implement V3 setup handler\n // Setup temporarily disabled during migration - needs proper V3 implementation\n // setup: {\n // handler: './lifecycle/setup.js#default',\n // handlerPath: './lifecycle/setup.js',\n // describe: 'Initialize .kb/commit/ directory structure.',\n // permissions: permissions.combine(\n // permissions.presets.pluginWorkspace('commit'),\n // {\n // quotas: { timeoutMs: 10000, memoryMb: 128, cpuMs: 3000 },\n // }\n // ),\n // },\n\n // V3: cli wrapper with commands array\n cli: {\n commands: [\n // Main command: commit (default flow)\n {\n id: 'commit',\n group: 'commit',\n describe: 'Generate and apply commits (default flow).',\n longDescription:\n 'Analyzes changes, generates commit plan with LLM, applies commits locally. ' +\n 'Use --dry-run to preview without applying, --with-push to push after applying.',\n\n // ✅ V3: handler with #default suffix\n handler: './cli/commands/run.js#default',\n handlerPath: './cli/commands/run.js',\n\n flags: defineCommandFlags(runFlags),\n\n examples: [\n 'kb commit commit',\n 'kb commit commit --dry-run',\n 'kb commit commit --with-push',\n 'kb commit commit --scope \"src/components/**\"',\n ],\n },\n\n // commit:generate - Generate commit plan\n {\n id: 'generate',\n group: 'commit',\n describe: 'Generate commit plan from git changes.',\n longDescription:\n 'Analyzes staged and unstaged changes using git diff, then uses LLM to group ' +\n 'related changes and generate conventional commit messages.',\n\n handler: './cli/commands/generate.js#default',\n handlerPath: './cli/commands/generate.js',\n\n flags: defineCommandFlags(generateFlags),\n\n examples: [\n 'kb commit generate',\n 'kb commit generate --json',\n 'kb commit generate --scope \"packages/**\"',\n ],\n },\n\n // commit:apply - Apply commit plan\n {\n id: 'apply',\n group: 'commit',\n describe: 'Apply current commit plan (create local commits).',\n longDescription:\n 'Creates git commits according to the current plan. Checks for staleness ' +\n '(working tree changes since plan generation) unless --force is used.',\n\n handler: './cli/commands/apply.js#default',\n handlerPath: './cli/commands/apply.js',\n\n flags: defineCommandFlags(applyFlags),\n\n examples: [\n 'kb commit apply',\n 'kb commit apply --force',\n ],\n },\n\n // commit:push - Push commits\n {\n id: 'push',\n group: 'commit',\n describe: 'Push commits to remote repository.',\n longDescription:\n 'Pushes local commits to the remote. Refuses force push to protected branches ' +\n '(main, master) by default.',\n\n handler: './cli/commands/push.js#default',\n handlerPath: './cli/commands/push.js',\n\n flags: defineCommandFlags(pushFlags),\n\n examples: [\n 'kb commit push',\n ],\n },\n\n // commit:open - Show current plan\n {\n id: 'open',\n group: 'commit',\n describe: 'Show current commit plan.',\n longDescription: 'Displays the current commit plan if one exists.',\n\n handler: './cli/commands/open.js#default',\n handlerPath: './cli/commands/open.js',\n\n flags: defineCommandFlags(jsonOnlyFlags),\n\n examples: [\n 'kb commit open',\n 'kb commit open --json',\n ],\n },\n\n // commit:reset - Clear current plan\n {\n id: 'reset',\n group: 'commit',\n describe: 'Clear current commit plan.',\n longDescription: 'Removes the current commit plan from storage.',\n\n handler: './cli/commands/reset.js#default',\n handlerPath: './cli/commands/reset.js',\n\n flags: defineCommandFlags(emptyFlags),\n\n examples: [\n 'kb commit reset',\n ],\n },\n ],\n },\n\n capabilities: [],\n\n // ✅ V3: Manifest-first permissions using composable presets\n permissions: pluginPermissions,\n\n // REST API routes (inherit permissions from manifest)\n rest: {\n basePath: COMMIT_BASE_PATH,\n routes: [\n // GET /scopes\n {\n method: 'GET',\n path: COMMIT_ROUTES.SCOPES,\n handler: './rest/handlers/scopes-handler.js#default',\n output: {\n zod: '@kb-labs/sdk#SelectDataSchema',\n },\n },\n // GET /status\n {\n method: 'GET',\n path: COMMIT_ROUTES.STATUS,\n handler: './rest/handlers/status-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#StatusResponseSchema',\n },\n },\n // POST /generate\n {\n method: 'POST',\n path: COMMIT_ROUTES.GENERATE,\n handler: './rest/handlers/generate-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#GenerateRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#GenerateResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for LLM analysis\n },\n // GET /plan\n {\n method: 'GET',\n path: COMMIT_ROUTES.PLAN,\n handler: './rest/handlers/plan-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#PlanResponseSchema',\n },\n },\n // POST /apply\n {\n method: 'POST',\n path: COMMIT_ROUTES.APPLY,\n handler: './rest/handlers/apply-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#ApplyRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#ApplyResponseSchema',\n },\n timeoutMs: 600000, // 10 min for pre/post hooks\n },\n // POST /push\n {\n method: 'POST',\n path: COMMIT_ROUTES.PUSH,\n handler: './rest/handlers/push-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#PushRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#PushResponseSchema',\n },\n timeoutMs: 600000, // 10 min for pre/post push hooks\n },\n // DELETE /plan\n {\n method: 'DELETE',\n path: COMMIT_ROUTES.RESET,\n handler: './rest/handlers/reset-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#ResetResponseSchema',\n },\n },\n // GET /git-status\n {\n method: 'GET',\n path: COMMIT_ROUTES.GIT_STATUS,\n handler: './rest/handlers/git-status-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#GitStatusResponseSchema',\n },\n },\n // GET /files\n {\n method: 'GET',\n path: COMMIT_ROUTES.FILES,\n handler: './rest/handlers/files-handler.js#default',\n },\n // GET /diff\n {\n method: 'GET',\n path: COMMIT_ROUTES.DIFF,\n handler: './rest/handlers/diff-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#FileDiffResponseSchema',\n },\n },\n // POST /summarize\n {\n method: 'POST',\n path: COMMIT_ROUTES.SUMMARIZE,\n handler: './rest/handlers/summarize-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#SummarizeRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#SummarizeResponseSchema',\n },\n },\n // GET /actions\n {\n method: 'GET',\n path: COMMIT_ROUTES.ACTIONS,\n handler: './rest/handlers/actions-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#ActionsResponseSchema',\n },\n },\n // PATCH /plan — edit a single commit in the plan\n {\n method: 'PATCH',\n path: COMMIT_ROUTES.PATCH_PLAN,\n handler: './rest/handlers/patch-plan-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#PatchPlanRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#PatchPlanResponseSchema',\n },\n },\n // POST /regenerate-commit — regenerate a single commit with LLM\n {\n method: 'POST',\n path: COMMIT_ROUTES.REGENERATE_COMMIT,\n handler: './rest/handlers/regenerate-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#RegenerateCommitRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#RegenerateCommitResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for LLM analysis\n },\n ],\n },\n\n // Studio V2 — Module Federation pages\n studio: {\n version: 2 as const,\n remoteName: 'commitPlugin',\n pages: [\n {\n id: 'commit.overview',\n title: 'Commit',\n icon: 'GitlabOutlined',\n route: '/p/commit',\n entry: './CommitOverview',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'commit',\n label: 'Commit',\n icon: 'GitlabOutlined',\n target: 'commit.overview',\n order: 30,\n },\n ],\n },\n\n // Legacy V1 studio widgets (deleted)\n /*\n _legacy_studio: {\n widgets: [\n // Workspace Selector\n {\n id: 'commit.workspace-selector',\n kind: 'select',\n title: 'Select Scope',\n description: 'Choose monorepo package or repository',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.SCOPES,\n method: 'GET',\n },\n },\n options: {\n searchable: true,\n placeholder: 'Select scope...',\n },\n events: {\n emit: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n payloadMap: { scope: 'value' }, // Maps selected value to payload.scope\n }],\n },\n layoutHint: { w: 6, h: 1, minH: 1 },\n order: 0,\n },\n // Status Metrics\n {\n id: 'commit.status',\n kind: 'metric-group',\n title: 'Commit Status',\n description: 'Current plan and git status',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.STATUS,\n method: 'GET',\n },\n },\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' }, // Maps payload.workspace to params.workspace\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n layoutHint: { w: 6, h: 2, minH: 2 },\n order: 1,\n },\n // Plan Viewer (child of commit.plan-section)\n {\n id: 'commit.plan-viewer',\n kind: 'cardlist',\n title: '', // Title shown in parent section\n description: '',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PLAN,\n method: 'GET',\n },\n },\n options: {\n layout: 'list',\n emptyMessage: 'No plan. Click Generate Plan to create commits.',\n },\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n },\n {\n name: COMMIT_EVENTS.PLAN_GENERATED,\n // When plan is generated, update widget data with cards\n // No paramsMap - use entire payload as widget data\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n order: 2,\n },\n // Git Files Table (child of commit.files-section)\n {\n id: 'commit.git-files',\n kind: 'table',\n title: '', // Title shown in parent section\n description: '',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.FILES,\n method: 'GET',\n },\n },\n options: {\n columns: [\n {\n id: 'path',\n label: 'File',\n sortable: true,\n width: '60%',\n },\n {\n id: 'status',\n label: 'Status',\n sortable: true,\n width: 80,\n },\n {\n id: 'changes',\n label: 'Changes',\n sortable: false,\n width: 120,\n },\n ],\n pagination: false,\n rowSelection: false,\n size: 'small',\n },\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n order: 3,\n },\n // Quick Actions Widget\n {\n id: 'commit.actions',\n kind: 'card',\n title: 'Quick Actions',\n description: 'Common commit workflow actions',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.ACTIONS,\n method: 'GET',\n },\n },\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n actions: [\n {\n id: 'generate',\n label: 'Generate Plan',\n icon: 'ThunderboltOutlined',\n variant: 'primary',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.GENERATE,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n onSuccess: {\n emitEvent: COMMIT_EVENTS.PLAN_GENERATED,\n // Response data will be used as payload (contains plan + workspace)\n },\n },\n },\n {\n id: 'apply',\n label: 'Apply Commits',\n icon: 'CheckOutlined',\n variant: 'default',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.APPLY,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n },\n confirm: {\n title: 'Apply Commits',\n description: 'This will create git commits according to the plan. Continue?',\n confirmLabel: 'Apply',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'push',\n label: 'Push',\n icon: 'UploadOutlined',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PUSH,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n },\n confirm: {\n title: 'Push to Remote',\n description: 'This will push commits to the remote repository. Continue?',\n confirmLabel: 'Push',\n cancelLabel: 'Cancel',\n },\n },\n ],\n layoutHint: { w: 6, h: 3, minH: 2 },\n order: 6,\n },\n // Files Section (collapsible, GitLab-style)\n {\n id: 'commit.files-section',\n kind: 'section',\n title: 'Changed Files',\n description: 'Files with uncommitted changes',\n data: {\n source: { type: 'static' }, // Sections use static source (no data)\n },\n options: {\n collapsible: true,\n defaultExpanded: true,\n variant: 'bordered',\n icon: 'FolderOutlined',\n showDivider: true,\n },\n children: ['commit.git-files'],\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n layoutHint: { w: 6, h: 8, minH: 4 },\n order: 4,\n },\n // Plan Section (collapsible, GitLab-style)\n {\n id: 'commit.plan-section',\n kind: 'section',\n title: 'Commit Plan',\n description: 'Generated commits ready to apply',\n data: {\n source: { type: 'static' }, // Sections use static source (no data)\n },\n options: {\n collapsible: true,\n defaultExpanded: true,\n variant: 'bordered',\n icon: 'FileTextOutlined',\n showDivider: true,\n },\n children: ['commit.plan-viewer'],\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n layoutHint: { w: 6, h: 8, minH: 4 },\n order: 5,\n },\n ],\n // Studio menus\n menus: [\n {\n id: 'commit-menu',\n label: 'Commit',\n icon: 'GitlabOutlined',\n target: '/plugins/commit/overview',\n order: 0,\n },\n {\n id: 'commit-overview',\n label: 'Overview',\n icon: 'DashboardOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/overview',\n order: 1,\n },\n {\n id: 'commit-plan',\n label: 'Plan',\n icon: 'UnorderedListOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/plan',\n order: 2,\n },\n {\n id: 'commit-files',\n label: 'Files',\n icon: 'FileTextOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/files',\n order: 3,\n },\n ],\n // Studio layouts\n layouts: [\n // Overview page - Quick status and actions\n {\n id: 'commit.overview',\n kind: 'grid',\n title: 'Overview',\n description: 'Workspace status and quick actions',\n icon: 'home',\n widgets: [\n 'commit.workspace-selector',\n 'commit.status',\n 'commit.actions',\n 'commit.plan-section', // Show plan section on overview too\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 1,\n },\n // Plan page - GitLab-style commit plan view\n {\n id: 'commit.plan',\n kind: 'grid',\n title: 'Commit Plan',\n description: 'Review and manage generated commits',\n icon: 'list',\n widgets: [\n 'commit.workspace-selector',\n 'commit.files-section',\n 'commit.plan-section',\n ],\n actions: [\n {\n id: 'generate',\n label: 'Generate Plan',\n icon: 'ThunderboltOutlined',\n variant: 'primary',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.GENERATE,\n method: 'POST',\n },\n },\n {\n id: 'apply',\n label: 'Apply Commits',\n icon: 'CheckOutlined',\n variant: 'default',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.APPLY,\n method: 'POST',\n },\n confirm: {\n title: 'Apply Commits',\n description: 'This will create git commits according to the plan. Continue?',\n confirmLabel: 'Apply',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'push',\n label: 'Push',\n icon: 'UploadOutlined',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PUSH,\n method: 'POST',\n },\n confirm: {\n title: 'Push to Remote',\n description: 'This will push commits to the remote repository. Continue?',\n confirmLabel: 'Push',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'reset',\n label: 'Reset Plan',\n icon: 'DeleteOutlined',\n variant: 'danger',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.RESET,\n method: 'DELETE',\n },\n confirm: {\n title: 'Reset Plan',\n description: 'This will delete the current commit plan. This action cannot be undone.',\n confirmLabel: 'Delete',\n cancelLabel: 'Cancel',\n },\n },\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 2,\n },\n // Files page - Changed files table\n {\n id: 'commit.files',\n kind: 'grid',\n title: 'Changed Files',\n description: 'Git status and modified files',\n icon: 'file',\n widgets: [\n 'commit.workspace-selector',\n 'commit.git-files',\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 3,\n },\n ],\n },\n */\n\n // Artifacts\n artifacts: [\n {\n id: 'commit.plan.json',\n pathTemplate: '.kb/commit/current/plan.json',\n description: 'Current commit plan.',\n },\n {\n id: 'commit.status.json',\n pathTemplate: '.kb/commit/current/status.json',\n description: 'Git status snapshot at plan generation time.',\n },\n ],\n};\n\nexport default manifest;\n"]}
1
+ {"version":3,"sources":["../src/cli/commands/flags.ts","../src/lifecycle/setup.ts","../src/manifest.ts"],"names":[],"mappings":"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KAAA,EAAO;AAAA;AACT;AACF,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyaA,SAAA,EAAW;AAAA,IACT;AAAA,MACE,EAAA,EAAI,kBAAA;AAAA,MACJ,YAAA,EAAc,8BAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,EAAA,EAAI,oBAAA;AAAA,MACJ,YAAA,EAAc,gCAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf;AAEJ","file":"index.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n","/**\n * Setup handler for commit plugin\n * Initializes .kb/commit/ directory structure and config\n */\n\nimport { defaultCommitConfig } from '@kb-labs/commit-contracts';\n\nconst COMMIT_DIR = '.kb/commit';\n\n/**\n * Plugin setup configuration\n *\n * Uses CommitPluginConfig from contracts as single source of truth.\n */\nexport const setup = {\n files: [\n {\n path: `${COMMIT_DIR}/README.md`,\n content: [\n '# Commit Plugin Workspace',\n '',\n 'This directory contains commit plugin data:',\n '',\n '- `current/` - Current commit plan (generated, not committed)',\n '- `history/` - Applied commit plans history',\n '',\n '## Configuration',\n '',\n 'Plugin configuration is stored in `kb.config.json` under `plugins.commit`.',\n '',\n '### Environment Variables',\n '',\n '| Variable | Description | Default |',\n '|----------|-------------|---------|',\n '| `KB_COMMIT_LLM_ENABLED` | Enable/disable LLM | `true` |',\n '| `KB_COMMIT_LLM_TEMPERATURE` | LLM temperature (0-1) | `0.3` |',\n '| `KB_COMMIT_LLM_MAX_TOKENS` | Max tokens for LLM | `2000` |',\n '| `KB_COMMIT_STORAGE_DIR` | Storage directory | `.kb/commit` |',\n '| `KB_COMMIT_AUTO_STAGE` | Auto-stage changes | `false` |',\n '',\n '## Commands',\n '',\n '```bash',\n '# Full flow: generate → apply',\n 'kb commit',\n '',\n '# Generate plan only',\n 'kb commit:generate',\n '',\n '# Apply current plan',\n 'kb commit:apply',\n '',\n '# View current plan',\n 'kb commit:open',\n '',\n '# Reset current plan',\n 'kb commit:reset',\n '',\n '# Push commits',\n 'kb commit:push',\n '```',\n '',\n 'Re-run `kb commit setup --force` to regenerate defaults.',\n ].join('\\n') + '\\n',\n description: 'README for commit plugin workspace',\n },\n ],\n\n config: [\n {\n pointer: 'plugins.commit',\n value: defaultCommitConfig,\n },\n ],\n\n scripts: [\n {\n name: 'commit',\n command: 'kb commit',\n description: 'Generate and apply commits',\n },\n {\n name: 'commit:generate',\n command: 'kb commit:generate',\n description: 'Generate commit plan from changes',\n },\n ],\n\n gitignore: [\n '.kb/commit/current/',\n '.kb/commit/history/',\n ],\n\n notes: [\n 'Run `kb commit` to analyze changes and generate commit plan.',\n 'Set KB_COMMIT_LLM_ENABLED=false to use heuristics only.',\n 'Use `kb commit:open` to view current plan before applying.',\n ],\n};\n\n/**\n * Setup handler function (for manifest registration)\n */\nexport async function run() {\n return {\n message: 'Commit plugin setup completed. Try `kb commit` to generate commits!',\n ...setup,\n };\n}\n\nexport default run;\n","/**\n * KB Labs Commit Plugin - Manifest V3\n *\n * Migration from V2 to V3 following best practices from V3-MIGRATION-GUIDE.md\n *\n * Key changes:\n * - Schema: kb.plugin/3\n * - Commands use handler#default suffix\n * - Commands have handlerPath field\n * - All imports from @kb-labs/sdk\n */\n\nimport {\n defineCommandFlags,\n combinePermissions,\n gitWorkflowPreset,\n kbPlatformPreset,\n} from '@kb-labs/sdk';\nimport {\n COMMIT_ENV_VARS,\n COMMIT_BASE_PATH,\n COMMIT_ROUTES,\n COMMIT_CACHE_PREFIX,\n} from '@kb-labs/commit-contracts';\nimport {\n runFlags,\n generateFlags,\n applyFlags,\n pushFlags,\n jsonOnlyFlags,\n emptyFlags,\n} from './cli/commands/flags';\n\n/**\n * Build permissions using presets:\n * - gitWorkflow: HOME, USER, GIT_*, SSH_* for git operations\n * - kbPlatform: KB_* env vars and .kb/ directory\n * - Custom: COMMIT_ENV_VARS, quotas, platform services (llm, cache)\n *\n * Note: LLM access goes through platform services, no direct API keys needed.\n */\nconst pluginPermissions = combinePermissions()\n .with(gitWorkflowPreset)\n .with(kbPlatformPreset)\n .withEnv([...COMMIT_ENV_VARS])\n .withFs({\n mode: 'readWrite',\n allow: ['.kb/commit/**'],\n })\n .withPlatform({\n llm: true, // Full LLM access for commit generation\n cache: [COMMIT_CACHE_PREFIX], // Cache namespace prefix from contracts\n analytics: true, // Track commit generation events\n })\n .withQuotas({\n timeoutMs: 600000, // 10 min for LLM\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/commit',\n version: '0.1.0',\n configSection: 'commit',\n\n display: {\n name: 'Commit Generator',\n description: 'AI-powered conventional commit generation',\n tags: ['commit', 'git', 'ai', 'conventional-commits'],\n },\n\n // Platform requirements (LLM is optional but preferred)\n platform: {\n requires: ['storage', 'cache'],\n optional: ['llm', 'analytics', 'logger'],\n },\n\n // TODO: Implement V3 setup handler\n // Setup temporarily disabled during migration - needs proper V3 implementation\n // setup: {\n // handler: './lifecycle/setup.js#default',\n // handlerPath: './lifecycle/setup.js',\n // describe: 'Initialize .kb/commit/ directory structure.',\n // permissions: permissions.combine(\n // permissions.presets.pluginWorkspace('commit'),\n // {\n // quotas: { timeoutMs: 10000, memoryMb: 128, cpuMs: 3000 },\n // }\n // ),\n // },\n\n // V3: cli wrapper with commands array\n cli: {\n groupMeta: [\n {\n path: 'commit',\n describe: 'AI-powered conventional commit generation.',\n },\n ],\n commands: [\n // Main command: commit (default flow)\n {\n path: 'commit',\n category: 'Pipeline',\n describe: 'Generate and apply commits (default flow).',\n operationType: 'execute' as const,\n longDescription:\n 'Analyzes changes, generates commit plan with LLM, applies commits locally. ' +\n 'Use --dry-run to preview without applying, --with-push to push after applying.',\n\n // ✅ V3: handler with #default suffix\n handler: './cli/commands/run.js#default',\n\n flags: defineCommandFlags(runFlags),\n\n examples: [\n 'kb commit commit',\n 'kb commit commit --dry-run',\n 'kb commit commit --with-push',\n 'kb commit commit --scope \"src/components/**\"',\n ],\n },\n\n // commit:generate - Generate commit plan\n {\n path: 'commit generate',\n category: 'Pipeline',\n describe: 'Generate commit plan from git changes.',\n operationType: 'execute' as const,\n longDescription:\n 'Analyzes staged and unstaged changes using git diff, then uses LLM to group ' +\n 'related changes and generate conventional commit messages.',\n\n handler: './cli/commands/generate.js#default',\n\n flags: defineCommandFlags(generateFlags),\n\n examples: [\n 'kb commit generate',\n 'kb commit generate --json',\n 'kb commit generate --scope \"packages/**\"',\n ],\n },\n\n // commit:apply - Apply commit plan\n {\n path: 'commit apply',\n category: 'Pipeline',\n describe: 'Apply current commit plan (create local commits).',\n operationType: 'mutate' as const,\n longDescription:\n 'Creates git commits according to the current plan. Checks for staleness ' +\n '(working tree changes since plan generation) unless --force is used.',\n\n handler: './cli/commands/apply.js#default',\n\n flags: defineCommandFlags(applyFlags),\n\n examples: [\n 'kb commit apply',\n 'kb commit apply --force',\n ],\n },\n\n // commit:push - Push commits\n {\n path: 'commit push',\n category: 'Pipeline',\n describe: 'Push commits to remote repository.',\n operationType: 'execute' as const,\n longDescription:\n 'Pushes local commits to the remote. Refuses force push to protected branches ' +\n '(main, master) by default.',\n\n handler: './cli/commands/push.js#default',\n\n flags: defineCommandFlags(pushFlags),\n\n examples: [\n 'kb commit push',\n ],\n },\n\n // commit:open - Show current plan\n {\n path: 'commit open',\n category: 'Plan',\n describe: 'Show current commit plan.',\n operationType: 'read' as const,\n longDescription: 'Displays the current commit plan if one exists.',\n\n handler: './cli/commands/open.js#default',\n\n flags: defineCommandFlags(jsonOnlyFlags),\n\n examples: [\n 'kb commit open',\n 'kb commit open --json',\n ],\n },\n\n // commit:reset - Clear current plan\n {\n path: 'commit reset',\n category: 'Plan',\n describe: 'Clear current commit plan.',\n operationType: 'mutate' as const,\n longDescription: 'Removes the current commit plan from storage.',\n\n handler: './cli/commands/reset.js#default',\n\n flags: defineCommandFlags(emptyFlags),\n\n examples: [\n 'kb commit reset',\n ],\n },\n ],\n },\n\n capabilities: [],\n\n // ✅ V3: Manifest-first permissions using composable presets\n permissions: pluginPermissions,\n\n // REST API routes (inherit permissions from manifest)\n rest: {\n basePath: COMMIT_BASE_PATH,\n routes: [\n // GET /scopes\n {\n method: 'GET',\n path: COMMIT_ROUTES.SCOPES,\n handler: './rest/handlers/scopes-handler.js#default',\n output: {\n zod: '@kb-labs/sdk#SelectDataSchema',\n },\n },\n // GET /status\n {\n method: 'GET',\n path: COMMIT_ROUTES.STATUS,\n handler: './rest/handlers/status-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#StatusResponseSchema',\n },\n },\n // POST /generate\n {\n method: 'POST',\n path: COMMIT_ROUTES.GENERATE,\n handler: './rest/handlers/generate-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#GenerateRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#GenerateResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for LLM analysis\n },\n // GET /plan\n {\n method: 'GET',\n path: COMMIT_ROUTES.PLAN,\n handler: './rest/handlers/plan-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#PlanResponseSchema',\n },\n },\n // POST /apply\n {\n method: 'POST',\n path: COMMIT_ROUTES.APPLY,\n handler: './rest/handlers/apply-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#ApplyRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#ApplyResponseSchema',\n },\n timeoutMs: 600000, // 10 min for pre/post hooks\n },\n // POST /push\n {\n method: 'POST',\n path: COMMIT_ROUTES.PUSH,\n handler: './rest/handlers/push-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#PushRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#PushResponseSchema',\n },\n timeoutMs: 600000, // 10 min for pre/post push hooks\n },\n // DELETE /plan\n {\n method: 'DELETE',\n path: COMMIT_ROUTES.RESET,\n handler: './rest/handlers/reset-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#ResetResponseSchema',\n },\n },\n // GET /git-status\n {\n method: 'GET',\n path: COMMIT_ROUTES.GIT_STATUS,\n handler: './rest/handlers/git-status-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#GitStatusResponseSchema',\n },\n },\n // GET /files\n {\n method: 'GET',\n path: COMMIT_ROUTES.FILES,\n handler: './rest/handlers/files-handler.js#default',\n },\n // GET /diff\n {\n method: 'GET',\n path: COMMIT_ROUTES.DIFF,\n handler: './rest/handlers/diff-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#FileDiffResponseSchema',\n },\n },\n // POST /summarize\n {\n method: 'POST',\n path: COMMIT_ROUTES.SUMMARIZE,\n handler: './rest/handlers/summarize-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#SummarizeRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#SummarizeResponseSchema',\n },\n },\n // GET /actions\n {\n method: 'GET',\n path: COMMIT_ROUTES.ACTIONS,\n handler: './rest/handlers/actions-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#ActionsResponseSchema',\n },\n },\n // PATCH /plan — edit a single commit in the plan\n {\n method: 'PATCH',\n path: COMMIT_ROUTES.PATCH_PLAN,\n handler: './rest/handlers/patch-plan-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#PatchPlanRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#PatchPlanResponseSchema',\n },\n },\n // POST /regenerate-commit — regenerate a single commit with LLM\n {\n method: 'POST',\n path: COMMIT_ROUTES.REGENERATE_COMMIT,\n handler: './rest/handlers/regenerate-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#RegenerateCommitRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#RegenerateCommitResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for LLM analysis\n },\n ],\n },\n\n // Studio V2 — Module Federation pages\n studio: {\n version: 2 as const,\n remoteName: 'commitPlugin',\n pages: [\n {\n id: 'commit.overview',\n title: 'Commit',\n icon: 'GitlabOutlined',\n route: '/p/commit',\n entry: './CommitOverview',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'commit',\n label: 'Commit',\n icon: 'GitlabOutlined',\n target: 'commit.overview',\n order: 30,\n },\n ],\n },\n\n // Legacy V1 studio widgets (deleted)\n /*\n _legacy_studio: {\n widgets: [\n // Workspace Selector\n {\n id: 'commit.workspace-selector',\n kind: 'select',\n title: 'Select Scope',\n description: 'Choose monorepo package or repository',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.SCOPES,\n method: 'GET',\n },\n },\n options: {\n searchable: true,\n placeholder: 'Select scope...',\n },\n events: {\n emit: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n payloadMap: { scope: 'value' }, // Maps selected value to payload.scope\n }],\n },\n layoutHint: { w: 6, h: 1, minH: 1 },\n order: 0,\n },\n // Status Metrics\n {\n id: 'commit.status',\n kind: 'metric-group',\n title: 'Commit Status',\n description: 'Current plan and git status',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.STATUS,\n method: 'GET',\n },\n },\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' }, // Maps payload.workspace to params.workspace\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n layoutHint: { w: 6, h: 2, minH: 2 },\n order: 1,\n },\n // Plan Viewer (child of commit.plan-section)\n {\n id: 'commit.plan-viewer',\n kind: 'cardlist',\n title: '', // Title shown in parent section\n description: '',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PLAN,\n method: 'GET',\n },\n },\n options: {\n layout: 'list',\n emptyMessage: 'No plan. Click Generate Plan to create commits.',\n },\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n },\n {\n name: COMMIT_EVENTS.PLAN_GENERATED,\n // When plan is generated, update widget data with cards\n // No paramsMap - use entire payload as widget data\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n order: 2,\n },\n // Git Files Table (child of commit.files-section)\n {\n id: 'commit.git-files',\n kind: 'table',\n title: '', // Title shown in parent section\n description: '',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.FILES,\n method: 'GET',\n },\n },\n options: {\n columns: [\n {\n id: 'path',\n label: 'File',\n sortable: true,\n width: '60%',\n },\n {\n id: 'status',\n label: 'Status',\n sortable: true,\n width: 80,\n },\n {\n id: 'changes',\n label: 'Changes',\n sortable: false,\n width: 120,\n },\n ],\n pagination: false,\n rowSelection: false,\n size: 'small',\n },\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n order: 3,\n },\n // Quick Actions Widget\n {\n id: 'commit.actions',\n kind: 'card',\n title: 'Quick Actions',\n description: 'Common commit workflow actions',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.ACTIONS,\n method: 'GET',\n },\n },\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n actions: [\n {\n id: 'generate',\n label: 'Generate Plan',\n icon: 'ThunderboltOutlined',\n variant: 'primary',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.GENERATE,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n onSuccess: {\n emitEvent: COMMIT_EVENTS.PLAN_GENERATED,\n // Response data will be used as payload (contains plan + workspace)\n },\n },\n },\n {\n id: 'apply',\n label: 'Apply Commits',\n icon: 'CheckOutlined',\n variant: 'default',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.APPLY,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n },\n confirm: {\n title: 'Apply Commits',\n description: 'This will create git commits according to the plan. Continue?',\n confirmLabel: 'Apply',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'push',\n label: 'Push',\n icon: 'UploadOutlined',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PUSH,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n },\n confirm: {\n title: 'Push to Remote',\n description: 'This will push commits to the remote repository. Continue?',\n confirmLabel: 'Push',\n cancelLabel: 'Cancel',\n },\n },\n ],\n layoutHint: { w: 6, h: 3, minH: 2 },\n order: 6,\n },\n // Files Section (collapsible, GitLab-style)\n {\n id: 'commit.files-section',\n kind: 'section',\n title: 'Changed Files',\n description: 'Files with uncommitted changes',\n data: {\n source: { type: 'static' }, // Sections use static source (no data)\n },\n options: {\n collapsible: true,\n defaultExpanded: true,\n variant: 'bordered',\n icon: 'FolderOutlined',\n showDivider: true,\n },\n children: ['commit.git-files'],\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n layoutHint: { w: 6, h: 8, minH: 4 },\n order: 4,\n },\n // Plan Section (collapsible, GitLab-style)\n {\n id: 'commit.plan-section',\n kind: 'section',\n title: 'Commit Plan',\n description: 'Generated commits ready to apply',\n data: {\n source: { type: 'static' }, // Sections use static source (no data)\n },\n options: {\n collapsible: true,\n defaultExpanded: true,\n variant: 'bordered',\n icon: 'FileTextOutlined',\n showDivider: true,\n },\n children: ['commit.plan-viewer'],\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n layoutHint: { w: 6, h: 8, minH: 4 },\n order: 5,\n },\n ],\n // Studio menus\n menus: [\n {\n id: 'commit-menu',\n label: 'Commit',\n icon: 'GitlabOutlined',\n target: '/plugins/commit/overview',\n order: 0,\n },\n {\n id: 'commit-overview',\n label: 'Overview',\n icon: 'DashboardOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/overview',\n order: 1,\n },\n {\n id: 'commit-plan',\n label: 'Plan',\n icon: 'UnorderedListOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/plan',\n order: 2,\n },\n {\n id: 'commit-files',\n label: 'Files',\n icon: 'FileTextOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/files',\n order: 3,\n },\n ],\n // Studio layouts\n layouts: [\n // Overview page - Quick status and actions\n {\n id: 'commit.overview',\n kind: 'grid',\n title: 'Overview',\n description: 'Workspace status and quick actions',\n icon: 'home',\n widgets: [\n 'commit.workspace-selector',\n 'commit.status',\n 'commit.actions',\n 'commit.plan-section', // Show plan section on overview too\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 1,\n },\n // Plan page - GitLab-style commit plan view\n {\n id: 'commit.plan',\n kind: 'grid',\n title: 'Commit Plan',\n description: 'Review and manage generated commits',\n icon: 'list',\n widgets: [\n 'commit.workspace-selector',\n 'commit.files-section',\n 'commit.plan-section',\n ],\n actions: [\n {\n id: 'generate',\n label: 'Generate Plan',\n icon: 'ThunderboltOutlined',\n variant: 'primary',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.GENERATE,\n method: 'POST',\n },\n },\n {\n id: 'apply',\n label: 'Apply Commits',\n icon: 'CheckOutlined',\n variant: 'default',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.APPLY,\n method: 'POST',\n },\n confirm: {\n title: 'Apply Commits',\n description: 'This will create git commits according to the plan. Continue?',\n confirmLabel: 'Apply',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'push',\n label: 'Push',\n icon: 'UploadOutlined',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PUSH,\n method: 'POST',\n },\n confirm: {\n title: 'Push to Remote',\n description: 'This will push commits to the remote repository. Continue?',\n confirmLabel: 'Push',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'reset',\n label: 'Reset Plan',\n icon: 'DeleteOutlined',\n variant: 'danger',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.RESET,\n method: 'DELETE',\n },\n confirm: {\n title: 'Reset Plan',\n description: 'This will delete the current commit plan. This action cannot be undone.',\n confirmLabel: 'Delete',\n cancelLabel: 'Cancel',\n },\n },\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 2,\n },\n // Files page - Changed files table\n {\n id: 'commit.files',\n kind: 'grid',\n title: 'Changed Files',\n description: 'Git status and modified files',\n icon: 'file',\n widgets: [\n 'commit.workspace-selector',\n 'commit.git-files',\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 3,\n },\n ],\n },\n */\n\n // Artifacts\n artifacts: [\n {\n id: 'commit.plan.json',\n pathTemplate: '.kb/commit/current/plan.json',\n description: 'Current commit plan.',\n },\n {\n id: 'commit.status.json',\n pathTemplate: '.kb/commit/current/status.json',\n description: 'Git status snapshot at plan generation time.',\n },\n ],\n};\n\nexport default manifest;\n"]}
@@ -1,4 +1,4 @@
1
- import * as _kb_labs_perm_presets from '@kb-labs/perm-presets';
1
+ import * as _kb_labs_plugin_contracts from '@kb-labs/plugin-contracts';
2
2
 
3
3
  /**
4
4
  * KB Labs Commit Plugin - Manifest V3
@@ -26,13 +26,17 @@ declare const manifest: {
26
26
  optional: string[];
27
27
  };
28
28
  cli: {
29
- commands: {
30
- id: string;
31
- group: string;
29
+ groupMeta: {
30
+ path: string;
31
+ describe: string;
32
+ }[];
33
+ commands: ({
34
+ path: string;
35
+ category: string;
32
36
  describe: string;
37
+ operationType: "execute";
33
38
  longDescription: string;
34
39
  handler: string;
35
- handlerPath: string;
36
40
  flags: {
37
41
  name: string;
38
42
  type: "string" | "boolean" | "number" | "array";
@@ -43,10 +47,44 @@ declare const manifest: {
43
47
  required?: boolean;
44
48
  }[];
45
49
  examples: string[];
46
- }[];
50
+ } | {
51
+ path: string;
52
+ category: string;
53
+ describe: string;
54
+ operationType: "mutate";
55
+ longDescription: string;
56
+ handler: string;
57
+ flags: {
58
+ name: string;
59
+ type: "string" | "boolean" | "number" | "array";
60
+ alias?: string;
61
+ default?: unknown;
62
+ description?: string;
63
+ choices?: string[];
64
+ required?: boolean;
65
+ }[];
66
+ examples: string[];
67
+ } | {
68
+ path: string;
69
+ category: string;
70
+ describe: string;
71
+ operationType: "read";
72
+ longDescription: string;
73
+ handler: string;
74
+ flags: {
75
+ name: string;
76
+ type: "string" | "boolean" | "number" | "array";
77
+ alias?: string;
78
+ default?: unknown;
79
+ description?: string;
80
+ choices?: string[];
81
+ required?: boolean;
82
+ }[];
83
+ examples: string[];
84
+ })[];
47
85
  };
48
86
  capabilities: never[];
49
- permissions: _kb_labs_perm_presets.RuntimePermissionSpec;
87
+ permissions: _kb_labs_plugin_contracts.PermissionSpec;
50
88
  rest: {
51
89
  basePath: "/v1/plugins/commit";
52
90
  routes: ({
package/dist/manifest.js CHANGED
@@ -96,7 +96,7 @@ var manifest = {
96
96
  configSection: "commit",
97
97
  display: {
98
98
  name: "Commit Generator",
99
- description: "AI-powered commit generation with conventional commit support.",
99
+ description: "AI-powered conventional commit generation",
100
100
  tags: ["commit", "git", "ai", "conventional-commits"]
101
101
  },
102
102
  // Platform requirements (LLM is optional but preferred)
@@ -119,16 +119,22 @@ var manifest = {
119
119
  // },
120
120
  // V3: cli wrapper with commands array
121
121
  cli: {
122
+ groupMeta: [
123
+ {
124
+ path: "commit",
125
+ describe: "AI-powered conventional commit generation."
126
+ }
127
+ ],
122
128
  commands: [
123
129
  // Main command: commit (default flow)
124
130
  {
125
- id: "commit",
126
- group: "commit",
131
+ path: "commit",
132
+ category: "Pipeline",
127
133
  describe: "Generate and apply commits (default flow).",
134
+ operationType: "execute",
128
135
  longDescription: "Analyzes changes, generates commit plan with LLM, applies commits locally. Use --dry-run to preview without applying, --with-push to push after applying.",
129
136
  // ✅ V3: handler with #default suffix
130
137
  handler: "./cli/commands/run.js#default",
131
- handlerPath: "./cli/commands/run.js",
132
138
  flags: defineCommandFlags(runFlags),
133
139
  examples: [
134
140
  "kb commit commit",
@@ -139,12 +145,12 @@ var manifest = {
139
145
  },
140
146
  // commit:generate - Generate commit plan
141
147
  {
142
- id: "generate",
143
- group: "commit",
148
+ path: "commit generate",
149
+ category: "Pipeline",
144
150
  describe: "Generate commit plan from git changes.",
151
+ operationType: "execute",
145
152
  longDescription: "Analyzes staged and unstaged changes using git diff, then uses LLM to group related changes and generate conventional commit messages.",
146
153
  handler: "./cli/commands/generate.js#default",
147
- handlerPath: "./cli/commands/generate.js",
148
154
  flags: defineCommandFlags(generateFlags),
149
155
  examples: [
150
156
  "kb commit generate",
@@ -154,12 +160,12 @@ var manifest = {
154
160
  },
155
161
  // commit:apply - Apply commit plan
156
162
  {
157
- id: "apply",
158
- group: "commit",
163
+ path: "commit apply",
164
+ category: "Pipeline",
159
165
  describe: "Apply current commit plan (create local commits).",
166
+ operationType: "mutate",
160
167
  longDescription: "Creates git commits according to the current plan. Checks for staleness (working tree changes since plan generation) unless --force is used.",
161
168
  handler: "./cli/commands/apply.js#default",
162
- handlerPath: "./cli/commands/apply.js",
163
169
  flags: defineCommandFlags(applyFlags),
164
170
  examples: [
165
171
  "kb commit apply",
@@ -168,12 +174,12 @@ var manifest = {
168
174
  },
169
175
  // commit:push - Push commits
170
176
  {
171
- id: "push",
172
- group: "commit",
177
+ path: "commit push",
178
+ category: "Pipeline",
173
179
  describe: "Push commits to remote repository.",
180
+ operationType: "execute",
174
181
  longDescription: "Pushes local commits to the remote. Refuses force push to protected branches (main, master) by default.",
175
182
  handler: "./cli/commands/push.js#default",
176
- handlerPath: "./cli/commands/push.js",
177
183
  flags: defineCommandFlags(pushFlags),
178
184
  examples: [
179
185
  "kb commit push"
@@ -181,12 +187,12 @@ var manifest = {
181
187
  },
182
188
  // commit:open - Show current plan
183
189
  {
184
- id: "open",
185
- group: "commit",
190
+ path: "commit open",
191
+ category: "Plan",
186
192
  describe: "Show current commit plan.",
193
+ operationType: "read",
187
194
  longDescription: "Displays the current commit plan if one exists.",
188
195
  handler: "./cli/commands/open.js#default",
189
- handlerPath: "./cli/commands/open.js",
190
196
  flags: defineCommandFlags(jsonOnlyFlags),
191
197
  examples: [
192
198
  "kb commit open",
@@ -195,12 +201,12 @@ var manifest = {
195
201
  },
196
202
  // commit:reset - Clear current plan
197
203
  {
198
- id: "reset",
199
- group: "commit",
204
+ path: "commit reset",
205
+ category: "Plan",
200
206
  describe: "Clear current commit plan.",
207
+ operationType: "mutate",
201
208
  longDescription: "Removes the current commit plan from storage.",
202
209
  handler: "./cli/commands/reset.js#default",
203
- handlerPath: "./cli/commands/reset.js",
204
210
  flags: defineCommandFlags(emptyFlags),
205
211
  examples: [
206
212
  "kb commit reset"