cast-code 1.0.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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/dist/app.module.js +45 -0
  4. package/dist/app.module.js.map +1 -0
  5. package/dist/common/common.module.js +49 -0
  6. package/dist/common/common.module.js.map +1 -0
  7. package/dist/common/constants/index.js +105 -0
  8. package/dist/common/constants/index.js.map +1 -0
  9. package/dist/common/index.js +24 -0
  10. package/dist/common/index.js.map +1 -0
  11. package/dist/common/services/config.service.js +119 -0
  12. package/dist/common/services/config.service.js.map +1 -0
  13. package/dist/common/services/llm.service.js +56 -0
  14. package/dist/common/services/llm.service.js.map +1 -0
  15. package/dist/common/services/markdown-parser.service.js +101 -0
  16. package/dist/common/services/markdown-parser.service.js.map +1 -0
  17. package/dist/common/services/markdown-renderer.service.js +220 -0
  18. package/dist/common/services/markdown-renderer.service.js.map +1 -0
  19. package/dist/common/services/multi-llm.service.js +115 -0
  20. package/dist/common/services/multi-llm.service.js.map +1 -0
  21. package/dist/common/types/index.js +20 -0
  22. package/dist/common/types/index.js.map +1 -0
  23. package/dist/common/types/markdown.types.js +6 -0
  24. package/dist/common/types/markdown.types.js.map +1 -0
  25. package/dist/main.js +84 -0
  26. package/dist/main.js.map +1 -0
  27. package/dist/modules/agents/agents.module.js +43 -0
  28. package/dist/modules/agents/agents.module.js.map +1 -0
  29. package/dist/modules/agents/definitions/architect.md +35 -0
  30. package/dist/modules/agents/definitions/backend.md +43 -0
  31. package/dist/modules/agents/definitions/coder.md +34 -0
  32. package/dist/modules/agents/definitions/devops.md +42 -0
  33. package/dist/modules/agents/definitions/frontend.md +46 -0
  34. package/dist/modules/agents/definitions/reviewer.md +35 -0
  35. package/dist/modules/agents/definitions/tester.md +41 -0
  36. package/dist/modules/agents/index.js +23 -0
  37. package/dist/modules/agents/index.js.map +1 -0
  38. package/dist/modules/agents/services/agent-loader.service.js +150 -0
  39. package/dist/modules/agents/services/agent-loader.service.js.map +1 -0
  40. package/dist/modules/agents/services/agent-registry.service.js +108 -0
  41. package/dist/modules/agents/services/agent-registry.service.js.map +1 -0
  42. package/dist/modules/agents/types/agent.types.js +6 -0
  43. package/dist/modules/agents/types/agent.types.js.map +1 -0
  44. package/dist/modules/agents/types/index.js +20 -0
  45. package/dist/modules/agents/types/index.js.map +1 -0
  46. package/dist/modules/config/config.module.js +38 -0
  47. package/dist/modules/config/config.module.js.map +1 -0
  48. package/dist/modules/config/index.js +24 -0
  49. package/dist/modules/config/index.js.map +1 -0
  50. package/dist/modules/config/services/config-commands.service.js +405 -0
  51. package/dist/modules/config/services/config-commands.service.js.map +1 -0
  52. package/dist/modules/config/services/config-manager.service.js +175 -0
  53. package/dist/modules/config/services/config-manager.service.js.map +1 -0
  54. package/dist/modules/config/services/init-config.service.js +238 -0
  55. package/dist/modules/config/services/init-config.service.js.map +1 -0
  56. package/dist/modules/config/types/config.types.js +163 -0
  57. package/dist/modules/config/types/config.types.js.map +1 -0
  58. package/dist/modules/config/types/index.js +20 -0
  59. package/dist/modules/config/types/index.js.map +1 -0
  60. package/dist/modules/core/core.module.js +60 -0
  61. package/dist/modules/core/core.module.js.map +1 -0
  62. package/dist/modules/core/index.js +22 -0
  63. package/dist/modules/core/index.js.map +1 -0
  64. package/dist/modules/core/services/deep-agent.service.js +575 -0
  65. package/dist/modules/core/services/deep-agent.service.js.map +1 -0
  66. package/dist/modules/core/services/plan-mode.service.js +225 -0
  67. package/dist/modules/core/services/plan-mode.service.js.map +1 -0
  68. package/dist/modules/git/git.module.js +48 -0
  69. package/dist/modules/git/git.module.js.map +1 -0
  70. package/dist/modules/git/index.js +23 -0
  71. package/dist/modules/git/index.js.map +1 -0
  72. package/dist/modules/git/services/code-review.service.js +330 -0
  73. package/dist/modules/git/services/code-review.service.js.map +1 -0
  74. package/dist/modules/git/services/commit-generator.service.js +403 -0
  75. package/dist/modules/git/services/commit-generator.service.js.map +1 -0
  76. package/dist/modules/git/services/index.js +21 -0
  77. package/dist/modules/git/services/index.js.map +1 -0
  78. package/dist/modules/git/services/monorepo-detector.service.js +338 -0
  79. package/dist/modules/git/services/monorepo-detector.service.js.map +1 -0
  80. package/dist/modules/git/services/pr-generator.service.js +429 -0
  81. package/dist/modules/git/services/pr-generator.service.js.map +1 -0
  82. package/dist/modules/git/services/release-notes.service.js +426 -0
  83. package/dist/modules/git/services/release-notes.service.js.map +1 -0
  84. package/dist/modules/git/types/git.types.js +6 -0
  85. package/dist/modules/git/types/git.types.js.map +1 -0
  86. package/dist/modules/git/types/index.js +20 -0
  87. package/dist/modules/git/types/index.js.map +1 -0
  88. package/dist/modules/mcp/catalog/mcp-templates.js +606 -0
  89. package/dist/modules/mcp/catalog/mcp-templates.js.map +1 -0
  90. package/dist/modules/mcp/index.js +23 -0
  91. package/dist/modules/mcp/index.js.map +1 -0
  92. package/dist/modules/mcp/mcp.module.js +35 -0
  93. package/dist/modules/mcp/mcp.module.js.map +1 -0
  94. package/dist/modules/mcp/services/mcp-client.service.js +289 -0
  95. package/dist/modules/mcp/services/mcp-client.service.js.map +1 -0
  96. package/dist/modules/mcp/services/mcp-registry.service.js +197 -0
  97. package/dist/modules/mcp/services/mcp-registry.service.js.map +1 -0
  98. package/dist/modules/mcp/types/index.js +20 -0
  99. package/dist/modules/mcp/types/index.js.map +1 -0
  100. package/dist/modules/mcp/types/mcp.types.js +6 -0
  101. package/dist/modules/mcp/types/mcp.types.js.map +1 -0
  102. package/dist/modules/memory/index.js +23 -0
  103. package/dist/modules/memory/index.js.map +1 -0
  104. package/dist/modules/memory/memory.module.js +35 -0
  105. package/dist/modules/memory/memory.module.js.map +1 -0
  106. package/dist/modules/memory/services/memory-tools.service.js +78 -0
  107. package/dist/modules/memory/services/memory-tools.service.js.map +1 -0
  108. package/dist/modules/memory/services/memory.service.js +169 -0
  109. package/dist/modules/memory/services/memory.service.js.map +1 -0
  110. package/dist/modules/memory/types/index.js +20 -0
  111. package/dist/modules/memory/types/index.js.map +1 -0
  112. package/dist/modules/memory/types/memory.types.js +6 -0
  113. package/dist/modules/memory/types/memory.types.js.map +1 -0
  114. package/dist/modules/mentions/index.js +22 -0
  115. package/dist/modules/mentions/index.js.map +1 -0
  116. package/dist/modules/mentions/mentions.module.js +32 -0
  117. package/dist/modules/mentions/mentions.module.js.map +1 -0
  118. package/dist/modules/mentions/services/mentions.service.js +336 -0
  119. package/dist/modules/mentions/services/mentions.service.js.map +1 -0
  120. package/dist/modules/mentions/types/index.js +20 -0
  121. package/dist/modules/mentions/types/index.js.map +1 -0
  122. package/dist/modules/mentions/types/mention.types.js +19 -0
  123. package/dist/modules/mentions/types/mention.types.js.map +1 -0
  124. package/dist/modules/permissions/index.js +23 -0
  125. package/dist/modules/permissions/index.js.map +1 -0
  126. package/dist/modules/permissions/permissions.module.js +35 -0
  127. package/dist/modules/permissions/permissions.module.js.map +1 -0
  128. package/dist/modules/permissions/services/permission.service.js +269 -0
  129. package/dist/modules/permissions/services/permission.service.js.map +1 -0
  130. package/dist/modules/permissions/services/prompt.service.js +116 -0
  131. package/dist/modules/permissions/services/prompt.service.js.map +1 -0
  132. package/dist/modules/permissions/types/permission.types.js +32 -0
  133. package/dist/modules/permissions/types/permission.types.js.map +1 -0
  134. package/dist/modules/project/index.js +24 -0
  135. package/dist/modules/project/index.js.map +1 -0
  136. package/dist/modules/project/project.module.js +38 -0
  137. package/dist/modules/project/project.module.js.map +1 -0
  138. package/dist/modules/project/services/project-analyzer.service.js +1063 -0
  139. package/dist/modules/project/services/project-analyzer.service.js.map +1 -0
  140. package/dist/modules/project/services/project-context.service.js +62 -0
  141. package/dist/modules/project/services/project-context.service.js.map +1 -0
  142. package/dist/modules/project/services/project-loader.service.js +147 -0
  143. package/dist/modules/project/services/project-loader.service.js.map +1 -0
  144. package/dist/modules/project/types/index.js +20 -0
  145. package/dist/modules/project/types/index.js.map +1 -0
  146. package/dist/modules/project/types/project.types.js +6 -0
  147. package/dist/modules/project/types/project.types.js.map +1 -0
  148. package/dist/modules/repl/index.js +21 -0
  149. package/dist/modules/repl/index.js.map +1 -0
  150. package/dist/modules/repl/repl.module.js +66 -0
  151. package/dist/modules/repl/repl.module.js.map +1 -0
  152. package/dist/modules/repl/services/commands/agent-commands.service.js +196 -0
  153. package/dist/modules/repl/services/commands/agent-commands.service.js.map +1 -0
  154. package/dist/modules/repl/services/commands/git-commands.service.js +500 -0
  155. package/dist/modules/repl/services/commands/git-commands.service.js.map +1 -0
  156. package/dist/modules/repl/services/commands/mcp-commands.service.js +579 -0
  157. package/dist/modules/repl/services/commands/mcp-commands.service.js.map +1 -0
  158. package/dist/modules/repl/services/commands/project-commands.service.js +226 -0
  159. package/dist/modules/repl/services/commands/project-commands.service.js.map +1 -0
  160. package/dist/modules/repl/services/commands/repl-commands.service.js +254 -0
  161. package/dist/modules/repl/services/commands/repl-commands.service.js.map +1 -0
  162. package/dist/modules/repl/services/repl.service.js +647 -0
  163. package/dist/modules/repl/services/repl.service.js.map +1 -0
  164. package/dist/modules/repl/services/smart-input.js +544 -0
  165. package/dist/modules/repl/services/smart-input.js.map +1 -0
  166. package/dist/modules/repl/services/welcome-screen.service.js +117 -0
  167. package/dist/modules/repl/services/welcome-screen.service.js.map +1 -0
  168. package/dist/modules/repl/utils/prompts-with-esc.js +187 -0
  169. package/dist/modules/repl/utils/prompts-with-esc.js.map +1 -0
  170. package/dist/modules/repl/utils/theme.js +185 -0
  171. package/dist/modules/repl/utils/theme.js.map +1 -0
  172. package/dist/modules/skills/definitions/general/file-operations.md +60 -0
  173. package/dist/modules/skills/definitions/general/git-operations.md +59 -0
  174. package/dist/modules/skills/definitions/general/planning.md +86 -0
  175. package/dist/modules/skills/definitions/general/search.md +59 -0
  176. package/dist/modules/skills/definitions/specialized/api-design.md +85 -0
  177. package/dist/modules/skills/definitions/specialized/database-operations.md +78 -0
  178. package/dist/modules/skills/definitions/specialized/frontend-bootstrap.md +71 -0
  179. package/dist/modules/skills/definitions/specialized/react-patterns.md +77 -0
  180. package/dist/modules/skills/definitions/specialized/testing-strategies.md +79 -0
  181. package/dist/modules/skills/index.js +23 -0
  182. package/dist/modules/skills/index.js.map +1 -0
  183. package/dist/modules/skills/services/skill-loader.service.js +130 -0
  184. package/dist/modules/skills/services/skill-loader.service.js.map +1 -0
  185. package/dist/modules/skills/services/skill-registry.service.js +96 -0
  186. package/dist/modules/skills/services/skill-registry.service.js.map +1 -0
  187. package/dist/modules/skills/skills.module.js +38 -0
  188. package/dist/modules/skills/skills.module.js.map +1 -0
  189. package/dist/modules/skills/types/index.js +20 -0
  190. package/dist/modules/skills/types/index.js.map +1 -0
  191. package/dist/modules/skills/types/skill.types.js +6 -0
  192. package/dist/modules/skills/types/skill.types.js.map +1 -0
  193. package/dist/modules/tasks/index.js +24 -0
  194. package/dist/modules/tasks/index.js.map +1 -0
  195. package/dist/modules/tasks/services/plan-executor.service.js +199 -0
  196. package/dist/modules/tasks/services/plan-executor.service.js.map +1 -0
  197. package/dist/modules/tasks/services/plan-mode.service.js +118 -0
  198. package/dist/modules/tasks/services/plan-mode.service.js.map +1 -0
  199. package/dist/modules/tasks/services/plan-persistence.service.js +148 -0
  200. package/dist/modules/tasks/services/plan-persistence.service.js.map +1 -0
  201. package/dist/modules/tasks/services/task-management.service.js +255 -0
  202. package/dist/modules/tasks/services/task-management.service.js.map +1 -0
  203. package/dist/modules/tasks/services/task-tools.service.js +270 -0
  204. package/dist/modules/tasks/services/task-tools.service.js.map +1 -0
  205. package/dist/modules/tasks/tasks.module.js +49 -0
  206. package/dist/modules/tasks/tasks.module.js.map +1 -0
  207. package/dist/modules/tasks/types/task.types.js +21 -0
  208. package/dist/modules/tasks/types/task.types.js.map +1 -0
  209. package/dist/modules/tools/index.js +24 -0
  210. package/dist/modules/tools/index.js.map +1 -0
  211. package/dist/modules/tools/services/filesystem-tools.service.js +450 -0
  212. package/dist/modules/tools/services/filesystem-tools.service.js.map +1 -0
  213. package/dist/modules/tools/services/search-tools.service.js +63 -0
  214. package/dist/modules/tools/services/search-tools.service.js.map +1 -0
  215. package/dist/modules/tools/services/shell-tools.service.js +194 -0
  216. package/dist/modules/tools/services/shell-tools.service.js.map +1 -0
  217. package/dist/modules/tools/services/tools-registry.service.js +83 -0
  218. package/dist/modules/tools/services/tools-registry.service.js.map +1 -0
  219. package/dist/modules/tools/tools.module.js +46 -0
  220. package/dist/modules/tools/tools.module.js.map +1 -0
  221. package/package.json +74 -0
@@ -0,0 +1,500 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "GitCommandsService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return GitCommandsService;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _theme = require("../../utils/theme");
13
+ const _commitgeneratorservice = require("../../../git/services/commit-generator.service");
14
+ const _monorepodetectorservice = require("../../../git/services/monorepo-detector.service");
15
+ const _prgeneratorservice = require("../../../git/services/pr-generator.service");
16
+ const _codereviewservice = require("../../../git/services/code-review.service");
17
+ const _releasenotesservice = require("../../../git/services/release-notes.service");
18
+ function _ts_decorate(decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ }
24
+ function _ts_metadata(k, v) {
25
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
26
+ }
27
+ let GitCommandsService = class GitCommandsService {
28
+ runGit(cmd) {
29
+ const { execSync } = require('child_process');
30
+ try {
31
+ const output = execSync(cmd, {
32
+ encoding: 'utf-8',
33
+ cwd: process.cwd()
34
+ }).trim();
35
+ process.stdout.write(output ? `\r\n${output}\r\n\r\n` : ` ${(0, _theme.colorize)('(no output)', 'muted')}\r\n`);
36
+ } catch (e) {
37
+ process.stdout.write(`${_theme.Colors.red} ${e.message}${_theme.Colors.reset}\r\n`);
38
+ }
39
+ }
40
+ async cmdCommit(args, smartInput) {
41
+ const msg = args.join(' ');
42
+ if (!msg) {
43
+ await this.generateAndCommit(smartInput);
44
+ } else {
45
+ const { execSync } = require('child_process');
46
+ try {
47
+ execSync('git add -A', {
48
+ cwd: process.cwd()
49
+ });
50
+ execSync('git commit -F -', {
51
+ cwd: process.cwd(),
52
+ input: `${msg}\n`,
53
+ encoding: 'utf-8'
54
+ });
55
+ } catch {}
56
+ }
57
+ }
58
+ async generateAndCommit(smartInput) {
59
+ const w = (s)=>process.stdout.write(s);
60
+ if (!this.commitGenerator.hasChanges()) {
61
+ w(`${_theme.Colors.yellow} No changes to commit${_theme.Colors.reset}\r\n\r\n`);
62
+ return;
63
+ }
64
+ w(`\r\n${_theme.Colors.cyan}πŸ€– Analyzing changes...${_theme.Colors.reset}\r\n`);
65
+ const message = await this.commitGenerator.generateCommitMessage();
66
+ if (!message) {
67
+ w(`${_theme.Colors.red} Failed to generate commit message${_theme.Colors.reset}\r\n\r\n`);
68
+ return;
69
+ }
70
+ w(`\r\n${_theme.Colors.green}βœ“ Generated:${_theme.Colors.reset} ${(0, _theme.colorize)(message, 'cyan')}\r\n\r\n`);
71
+ const confirm = await smartInput.askChoice('Commit?', [
72
+ {
73
+ key: 'y',
74
+ label: 'yes',
75
+ description: 'Commit with this message'
76
+ },
77
+ {
78
+ key: 'n',
79
+ label: 'no',
80
+ description: 'Cancel'
81
+ },
82
+ {
83
+ key: 'e',
84
+ label: 'edit',
85
+ description: 'Edit message'
86
+ }
87
+ ]);
88
+ if (confirm === 'n') {
89
+ w((0, _theme.colorize)(' Cancelled\r\n\r\n', 'muted'));
90
+ return;
91
+ }
92
+ let finalMessage = message;
93
+ if (confirm === 'e') {
94
+ const newMsg = await smartInput.question((0, _theme.colorize)(' Message: ', 'cyan'));
95
+ if (!newMsg.trim()) {
96
+ w((0, _theme.colorize)(' Cancelled\r\n\r\n', 'muted'));
97
+ return;
98
+ }
99
+ finalMessage = newMsg.trim();
100
+ }
101
+ const success = this.commitGenerator.executeCommit(finalMessage);
102
+ if (success) {
103
+ w(`${_theme.Colors.green}βœ“ Committed${_theme.Colors.reset}\r\n\r\n`);
104
+ } else {
105
+ w(`${_theme.Colors.red}βœ— Commit failed${_theme.Colors.reset}\r\n\r\n`);
106
+ }
107
+ }
108
+ async cmdUp(smartInput) {
109
+ const w = (s)=>process.stdout.write(s);
110
+ if (!this.commitGenerator.hasChanges()) {
111
+ w(`${_theme.Colors.yellow} No changes to commit${_theme.Colors.reset}\r\n\r\n`);
112
+ return;
113
+ }
114
+ const monorepoInfo = this.monorepoDetector.detectMonorepo(process.cwd());
115
+ if (monorepoInfo.isMonorepo) {
116
+ w(`\r\n${(0, _theme.colorize)('Monorepo:', 'muted')} ${monorepoInfo.modules.join(', ')}\r\n`);
117
+ }
118
+ w(`\r\n${_theme.Colors.cyan}πŸ€– Analyzing changes...${_theme.Colors.reset}\r\n`);
119
+ const message = await this.commitGenerator.generateCommitMessage();
120
+ if (!message) {
121
+ w(`${_theme.Colors.red} Failed to generate commit message${_theme.Colors.reset}\r\n\r\n`);
122
+ return;
123
+ }
124
+ w(`\r\n${_theme.Colors.green}βœ“ Generated:${_theme.Colors.reset}\r\n ${(0, _theme.colorize)(message, 'cyan')}\r\n\r\n`);
125
+ const confirm = await smartInput.askChoice('Confirm and push?', [
126
+ {
127
+ key: 'y',
128
+ label: 'yes',
129
+ description: 'Commit and push'
130
+ },
131
+ {
132
+ key: 'n',
133
+ label: 'no',
134
+ description: 'Cancel'
135
+ },
136
+ {
137
+ key: 'e',
138
+ label: 'edit',
139
+ description: 'Edit message'
140
+ }
141
+ ]);
142
+ if (confirm === 'n') {
143
+ w((0, _theme.colorize)(' Cancelled\r\n\r\n', 'muted'));
144
+ return;
145
+ }
146
+ let finalMessage = message;
147
+ if (confirm === 'e') {
148
+ const instructions = await smartInput.question((0, _theme.colorize)(' Instructions for AI: ', 'cyan'));
149
+ if (!instructions.trim()) {
150
+ w((0, _theme.colorize)(' Cancelled\r\n\r\n', 'muted'));
151
+ return;
152
+ }
153
+ w(`\r\n${_theme.Colors.cyan}πŸ€– Regenerating...${_theme.Colors.reset}\r\n`);
154
+ const diffInfo = this.commitGenerator.getDiffInfo();
155
+ if (diffInfo) {
156
+ const refined = await this.commitGenerator.refineCommitMessage(message, instructions.trim(), diffInfo);
157
+ w(`\r\n${_theme.Colors.green}βœ“ Refined:${_theme.Colors.reset}\r\n ${(0, _theme.colorize)(refined, 'cyan')}\r\n\r\n`);
158
+ const confirmRefined = await smartInput.askChoice('Use this?', [
159
+ {
160
+ key: 'y',
161
+ label: 'yes',
162
+ description: 'Commit and push'
163
+ },
164
+ {
165
+ key: 'n',
166
+ label: 'no',
167
+ description: 'Cancel'
168
+ }
169
+ ]);
170
+ if (confirmRefined === 'n') {
171
+ w((0, _theme.colorize)(' Cancelled\r\n\r\n', 'muted'));
172
+ return;
173
+ }
174
+ finalMessage = refined;
175
+ }
176
+ }
177
+ w((0, _theme.colorize)(' Committing...\r\n', 'muted'));
178
+ const commitSuccess = this.commitGenerator.executeCommit(finalMessage, true);
179
+ if (!commitSuccess) {
180
+ w(`${_theme.Colors.red} βœ— Commit failed${_theme.Colors.reset}\r\n\r\n`);
181
+ return;
182
+ }
183
+ w(`${_theme.Colors.green} βœ“ Committed${_theme.Colors.reset}\r\n`);
184
+ w((0, _theme.colorize)(' Pushing...\r\n', 'muted'));
185
+ const pushResult = this.commitGenerator.executePush();
186
+ if (pushResult.success) {
187
+ w(`${_theme.Colors.green} βœ“ Pushed${_theme.Colors.reset}\r\n\r\n`);
188
+ } else {
189
+ w(`${_theme.Colors.red} βœ— Push failed:${_theme.Colors.reset} ${pushResult.error}\r\n\r\n`);
190
+ }
191
+ }
192
+ async cmdSplitUp(smartInput) {
193
+ const w = (s)=>process.stdout.write(s);
194
+ if (!this.commitGenerator.hasChanges()) {
195
+ w(`${_theme.Colors.yellow} No changes to commit${_theme.Colors.reset}\r\n\r\n`);
196
+ return;
197
+ }
198
+ w(`\r\n${_theme.Colors.cyan}πŸ€– Analyzing for split...${_theme.Colors.reset}\r\n`);
199
+ const proposedCommits = await this.commitGenerator.splitCommits();
200
+ const commits = (proposedCommits || []).filter((c)=>c.files && c.files.length > 0);
201
+ if (commits.length === 0) {
202
+ w(`${_theme.Colors.red} Failed to split commits${_theme.Colors.reset}\r\n\r\n`);
203
+ return;
204
+ }
205
+ w(`\r\n${_theme.Colors.green}βœ“ Proposed ${commits.length} commits:${_theme.Colors.reset}\r\n\r\n`);
206
+ for(let i = 0; i < commits.length; i++){
207
+ const commit = commits[i];
208
+ w(` ${(0, _theme.colorize)((i + 1).toString() + '.', 'cyan')} ${commit.message}\r\n`);
209
+ w(` ${(0, _theme.colorize)('Files: ' + commit.files.join(', '), 'muted')}\r\n`);
210
+ }
211
+ w('\r\n');
212
+ const confirm = await smartInput.askChoice('Execute these commits?', [
213
+ {
214
+ key: 'y',
215
+ label: 'yes',
216
+ description: `Commit all ${commits.length}`
217
+ },
218
+ {
219
+ key: 'n',
220
+ label: 'no',
221
+ description: 'Cancel'
222
+ }
223
+ ]);
224
+ if (confirm !== 'y') {
225
+ w((0, _theme.colorize)(' Cancelled\r\n\r\n', 'muted'));
226
+ return;
227
+ }
228
+ w((0, _theme.colorize)(' Executing...\r\n', 'muted'));
229
+ const result = this.commitGenerator.executeSplitCommits(commits);
230
+ if (result.success) {
231
+ w(`${_theme.Colors.green} βœ“ ${result.committed} commits executed${_theme.Colors.reset}\r\n\r\n`);
232
+ const { execSync } = require('child_process');
233
+ try {
234
+ const log = execSync(`git log --oneline -${result.committed}`, {
235
+ cwd: process.cwd(),
236
+ encoding: 'utf-8'
237
+ });
238
+ w((0, _theme.colorize)(' Commits criados:\r\n', 'bold'));
239
+ log.split('\n').filter((l)=>l.trim()).forEach((line)=>{
240
+ w(` ${(0, _theme.colorize)(line, 'muted')}\r\n`);
241
+ });
242
+ w('\r\n');
243
+ } catch {}
244
+ w((0, _theme.colorize)(' Pushing...\r\n', 'muted'));
245
+ const pushResult = this.commitGenerator.executePush();
246
+ if (pushResult.success) {
247
+ w(`${_theme.Colors.green} βœ“ Pushed${_theme.Colors.reset}\r\n\r\n`);
248
+ } else {
249
+ w(`${_theme.Colors.red} βœ— Push failed:${_theme.Colors.reset} ${pushResult.error}\r\n\r\n`);
250
+ }
251
+ } else {
252
+ w(`${_theme.Colors.red} βœ— Failed after ${result.committed} commit(s):${_theme.Colors.reset} ${result.error}\r\n`);
253
+ if (result.originalHead && result.committed > 0) {
254
+ w(`${(0, _theme.colorize)(' Rollback disponΓ­vel:', 'warning')}\r\n`);
255
+ w(` ${(0, _theme.colorize)(`git reset --soft ${result.originalHead}`, 'cyan')}\r\n\r\n`);
256
+ } else {
257
+ w('\r\n');
258
+ }
259
+ }
260
+ }
261
+ async cmdPr(smartInput) {
262
+ const w = (s)=>process.stdout.write(s);
263
+ const branch = this.prGenerator.getCurrentBranch();
264
+ if (branch === 'main' || branch === 'master' || branch === 'develop') {
265
+ w(`${_theme.Colors.yellow} Cannot create PR from ${branch} branch${_theme.Colors.reset}\r\n\r\n`);
266
+ return;
267
+ }
268
+ const detectedBase = this.prGenerator.detectDefaultBaseBranch();
269
+ const baseInput = await smartInput.question((0, _theme.colorize)(` Base branch (default: ${detectedBase}): `, 'cyan'));
270
+ const baseBranch = baseInput.trim() || detectedBase;
271
+ w(`\r\n${_theme.Colors.cyan}πŸ” Analyzing commits...${_theme.Colors.reset}\r\n`);
272
+ const commits = this.prGenerator.getCommitsNotInBase(baseBranch);
273
+ if (commits.length === 0) {
274
+ w(`${_theme.Colors.yellow} No commits found between ${branch} and ${baseBranch}${_theme.Colors.reset}\r\n\r\n`);
275
+ return;
276
+ }
277
+ w(`\r\n${_theme.Colors.green}βœ“ Found ${commits.length} commit(s):${_theme.Colors.reset}\r\n`);
278
+ for (const commit of commits){
279
+ w(` ${(0, _theme.colorize)(commit.hash.slice(0, 7), 'muted')} ${commit.message.slice(0, 50)}${commit.message.length > 50 ? '...' : ''}\r\n`);
280
+ }
281
+ w(`\r\n${_theme.Colors.cyan}πŸ€– Generating PR description...${_theme.Colors.reset}\r\n`);
282
+ const prDescription = await this.prGenerator.generatePRDescription(branch, commits, baseBranch);
283
+ w(`\r\n${(0, _theme.colorize)('─'.repeat(50), 'subtle')}\r\n`);
284
+ w((0, _theme.colorize)('Pull Request Preview:', 'bold') + '\r\n');
285
+ w((0, _theme.colorize)('─'.repeat(50), 'subtle') + '\r\n\r\n');
286
+ w(`${(0, _theme.colorize)('Title:', 'bold')}\r\n ${(0, _theme.colorize)(prDescription.title, 'cyan')}\r\n\r\n`);
287
+ const descLines = prDescription.description.split('\n');
288
+ for (const line of descLines.slice(0, 25)){
289
+ w(` ${line}\r\n`);
290
+ }
291
+ if (descLines.length > 25) {
292
+ w(` ${(0, _theme.colorize)(`... (${descLines.length - 25} more lines)`, 'muted')}\r\n`);
293
+ }
294
+ w(`\r\n${(0, _theme.colorize)('─'.repeat(50), 'subtle')}\r\n\r\n`);
295
+ const confirm = await smartInput.askChoice('Create this PR?', [
296
+ {
297
+ key: 'y',
298
+ label: 'yes',
299
+ description: 'Create PR on GitHub'
300
+ },
301
+ {
302
+ key: 'n',
303
+ label: 'no',
304
+ description: 'Cancel'
305
+ },
306
+ {
307
+ key: 'e',
308
+ label: 'edit',
309
+ description: 'Edit title/description'
310
+ }
311
+ ]);
312
+ if (confirm === 'n') {
313
+ w((0, _theme.colorize)(' Cancelled\r\n\r\n', 'muted'));
314
+ return;
315
+ }
316
+ let finalTitle = prDescription.title;
317
+ let finalDescription = prDescription.description;
318
+ if (confirm === 'e') {
319
+ const newTitle = await smartInput.question((0, _theme.colorize)(' Title (empty to keep): ', 'cyan'));
320
+ if (newTitle.trim()) {
321
+ finalTitle = newTitle.trim();
322
+ }
323
+ const editDesc = await smartInput.askChoice('Edit description?', [
324
+ {
325
+ key: 'y',
326
+ label: 'yes',
327
+ description: 'Open in editor'
328
+ },
329
+ {
330
+ key: 'n',
331
+ label: 'no',
332
+ description: 'Keep as is'
333
+ }
334
+ ]);
335
+ if (editDesc === 'y') {
336
+ const fs = require('fs');
337
+ const { execSync } = require('child_process');
338
+ const tempFile = `/tmp/pr-desc-${Date.now()}.md`;
339
+ fs.writeFileSync(tempFile, finalDescription);
340
+ const editor = process.env.EDITOR || 'nano';
341
+ try {
342
+ execSync(`${editor} "${tempFile}"`, {
343
+ stdio: 'inherit'
344
+ });
345
+ finalDescription = fs.readFileSync(tempFile, 'utf-8');
346
+ } catch {
347
+ w((0, _theme.colorize)(' Could not open editor\r\n', 'yellow'));
348
+ } finally{
349
+ try {
350
+ fs.unlinkSync(tempFile);
351
+ } catch {}
352
+ }
353
+ }
354
+ }
355
+ const { platform } = this.prGenerator.detectPlatform();
356
+ if (platform === 'github') {
357
+ try {
358
+ const { execSync } = require('child_process');
359
+ execSync(`git push origin ${branch}`, {
360
+ cwd: process.cwd()
361
+ });
362
+ } catch {}
363
+ }
364
+ const result = await this.prGenerator.createPR(finalTitle, finalDescription, baseBranch);
365
+ if (result.success && result.url) {
366
+ w(`\r\n${_theme.Colors.green}βœ“ Pull Request created!${_theme.Colors.reset}\r\n`);
367
+ w(` ${(0, _theme.colorize)(result.url, 'cyan')}\r\n\r\n`);
368
+ } else {
369
+ if (result.description) {
370
+ const copied = this.prGenerator.copyToClipboard(result.description);
371
+ w(`\r\n${(0, _theme.colorize)('PR Description:', 'bold')}\r\n`);
372
+ w((0, _theme.colorize)('─'.repeat(50), 'subtle') + '\r\n');
373
+ w(result.description.split('\n').slice(0, 30).join('\r\n') + '\r\n');
374
+ w((0, _theme.colorize)('─'.repeat(50), 'subtle') + '\r\n\r\n');
375
+ if (copied) {
376
+ w(`${(0, _theme.colorize)('βœ“', 'success')} Copied to clipboard\r\n`);
377
+ }
378
+ const createUrl = this.prGenerator.getPRCreateUrl(platform, baseBranch);
379
+ if (createUrl) {
380
+ w(`\r\n ${(0, _theme.colorize)('Open to create PR:', 'muted')}\r\n`);
381
+ w(` ${(0, _theme.colorize)(createUrl, 'cyan')}\r\n`);
382
+ }
383
+ }
384
+ w('\r\n');
385
+ }
386
+ }
387
+ async cmdReview(args) {
388
+ const w = (s)=>process.stdout.write(s);
389
+ let files = [];
390
+ if (args.length > 0) {
391
+ files = args.filter((a)=>!a.startsWith('/'));
392
+ } else {
393
+ w(`\r\n${_theme.Colors.cyan}πŸ” Analyzing staged files...${_theme.Colors.reset}\r\n`);
394
+ files = this.codeReviewService['getChangedFiles'](true);
395
+ }
396
+ if (files.length === 0) {
397
+ w(`${_theme.Colors.yellow} No files to review${_theme.Colors.reset}\r\n\r\n`);
398
+ return;
399
+ }
400
+ w(`\r\n${_theme.Colors.cyan}πŸ€– Reviewing ${files.length} file(s)...${_theme.Colors.reset}\r\n`);
401
+ const results = await this.codeReviewService.reviewFiles(files);
402
+ let totalIssues = 0;
403
+ let totalScore = 0;
404
+ for (const result of results){
405
+ totalScore += result.score;
406
+ const errors = result.issues.filter((i)=>i.severity === 'error').length;
407
+ const warnings = result.issues.filter((i)=>i.severity === 'warning').length;
408
+ const suggestions = result.issues.filter((i)=>i.severity === 'suggestion').length;
409
+ totalIssues += result.issues.length;
410
+ const scoreColor = result.score >= 80 ? 'success' : result.score >= 60 ? 'warning' : 'error';
411
+ w(`\r\n${(0, _theme.colorize)(result.file, 'bold')} ${(0, _theme.colorize)(result.score + '/100', scoreColor)}\r\n`);
412
+ w(` ${(0, _theme.colorize)(result.summary, 'muted')}\r\n`);
413
+ if (errors > 0) w(` ${(0, _theme.colorize)('βœ— ' + errors + ' errors', 'error')} `);
414
+ if (warnings > 0) w(`${(0, _theme.colorize)('⚠ ' + warnings + ' warnings', 'warning')} `);
415
+ if (suggestions > 0) w(`${(0, _theme.colorize)('πŸ’‘ ' + suggestions + ' suggestions', 'muted')}`);
416
+ if (errors > 0 || warnings > 0 || suggestions > 0) w('\r\n');
417
+ const topIssues = result.issues.filter((i)=>i.severity !== 'praise').slice(0, 3);
418
+ for (const issue of topIssues){
419
+ const icon = issue.severity === 'error' ? 'βœ—' : issue.severity === 'warning' ? '⚠' : 'πŸ’‘';
420
+ const color = issue.severity === 'error' ? 'error' : issue.severity === 'warning' ? 'warning' : 'muted';
421
+ const line = issue.line ? (0, _theme.colorize)(':' + issue.line, 'muted') : '';
422
+ w(` ${(0, _theme.colorize)(icon, color)} ${issue.message}${line}\r\n`);
423
+ }
424
+ if (result.issues.length > 3) {
425
+ w(` ${(0, _theme.colorize)('... and ' + (result.issues.length - 3) + ' more', 'muted')}\r\n`);
426
+ }
427
+ }
428
+ const avgScore = Math.round(totalScore / results.length);
429
+ const avgColor = avgScore >= 80 ? 'success' : avgScore >= 60 ? 'warning' : 'error';
430
+ w(`\r\n${(0, _theme.colorize)('Summary:', 'bold')} ${(0, _theme.colorize)(avgScore + '/100', avgColor)} | ${totalIssues} issue(s)\r\n\r\n`);
431
+ }
432
+ async cmdFix(args) {
433
+ const w = (s)=>process.stdout.write(s);
434
+ if (args.length === 0) {
435
+ w(`${_theme.Colors.yellow} Usage: /fix <file>${_theme.Colors.reset}\r\n\r\n`);
436
+ return;
437
+ }
438
+ const filePath = args[0];
439
+ w(`\r\n${_theme.Colors.cyan}πŸ”§ Fixing ${filePath}...${_theme.Colors.reset}\r\n`);
440
+ const result = await this.codeReviewService.fixFile(filePath);
441
+ if (result.success) {
442
+ w(`${_theme.Colors.green} βœ“ File fixed${_theme.Colors.reset}\r\n\r\n`);
443
+ } else {
444
+ w(`${_theme.Colors.red} βœ— Failed: ${result.error}${_theme.Colors.reset}\r\n\r\n`);
445
+ }
446
+ }
447
+ async cmdIdent() {
448
+ const w = (s)=>process.stdout.write(s);
449
+ w(`\r\n${_theme.Colors.cyan}🎨 Formatting code files...${_theme.Colors.reset}\r\n`);
450
+ const result = await this.codeReviewService.indentAll();
451
+ w(`${_theme.Colors.green} βœ“ ${result.success} file(s) formatted${_theme.Colors.reset}\r\n`);
452
+ if (result.failed > 0) {
453
+ w(`${_theme.Colors.yellow} ⚠ ${result.failed} file(s) failed${_theme.Colors.reset}\r\n`);
454
+ }
455
+ w('\r\n');
456
+ }
457
+ async cmdRelease(args) {
458
+ const w = (s)=>process.stdout.write(s);
459
+ const sinceTag = args[0];
460
+ w(`\r\n${_theme.Colors.cyan}πŸ“ Generating release notes...${_theme.Colors.reset}\r\n`);
461
+ const result = await this.releaseNotesService.generateReleaseNotes(sinceTag);
462
+ if (result.success && result.filePath) {
463
+ w(`${_theme.Colors.green} βœ“ Release notes generated!${_theme.Colors.reset}\r\n`);
464
+ w(` ${(0, _theme.colorize)(result.filePath, 'accent')}\r\n\r\n`);
465
+ if (result.content) {
466
+ w(`${(0, _theme.colorize)('Preview:', 'bold')}\r\n`);
467
+ const lines = result.content.split('\n').slice(0, 15);
468
+ for (const line of lines){
469
+ w(` ${line}\r\n`);
470
+ }
471
+ if (result.content.split('\n').length > 15) {
472
+ w(` ${(0, _theme.colorize)('...', 'muted')}\r\n`);
473
+ }
474
+ w('\r\n');
475
+ }
476
+ } else {
477
+ w(`${_theme.Colors.red} βœ— Failed: ${result.error}${_theme.Colors.reset}\r\n\r\n`);
478
+ }
479
+ }
480
+ constructor(commitGenerator, monorepoDetector, prGenerator, codeReviewService, releaseNotesService){
481
+ this.commitGenerator = commitGenerator;
482
+ this.monorepoDetector = monorepoDetector;
483
+ this.prGenerator = prGenerator;
484
+ this.codeReviewService = codeReviewService;
485
+ this.releaseNotesService = releaseNotesService;
486
+ }
487
+ };
488
+ GitCommandsService = _ts_decorate([
489
+ (0, _common.Injectable)(),
490
+ _ts_metadata("design:type", Function),
491
+ _ts_metadata("design:paramtypes", [
492
+ typeof _commitgeneratorservice.CommitGeneratorService === "undefined" ? Object : _commitgeneratorservice.CommitGeneratorService,
493
+ typeof _monorepodetectorservice.MonorepoDetectorService === "undefined" ? Object : _monorepodetectorservice.MonorepoDetectorService,
494
+ typeof _prgeneratorservice.PrGeneratorService === "undefined" ? Object : _prgeneratorservice.PrGeneratorService,
495
+ typeof _codereviewservice.CodeReviewService === "undefined" ? Object : _codereviewservice.CodeReviewService,
496
+ typeof _releasenotesservice.ReleaseNotesService === "undefined" ? Object : _releasenotesservice.ReleaseNotesService
497
+ ])
498
+ ], GitCommandsService);
499
+
500
+ //# sourceMappingURL=git-commands.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/modules/repl/services/commands/git-commands.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { Colors, colorize, Box, Icons } from '../../utils/theme';\nimport { CommitGeneratorService } from '../../../git/services/commit-generator.service';\nimport { MonorepoDetectorService } from '../../../git/services/monorepo-detector.service';\nimport { PrGeneratorService } from '../../../git/services/pr-generator.service';\nimport { CodeReviewService } from '../../../git/services/code-review.service';\nimport { ReleaseNotesService } from '../../../git/services/release-notes.service';\n\ninterface SmartInput {\n askChoice: (question: string, choices: { key: string; label: string; description: string }[]) => Promise<string>;\n question: (prompt: string) => Promise<string>;\n}\n\n@Injectable()\nexport class GitCommandsService {\n constructor(\n private readonly commitGenerator: CommitGeneratorService,\n private readonly monorepoDetector: MonorepoDetectorService,\n private readonly prGenerator: PrGeneratorService,\n private readonly codeReviewService: CodeReviewService,\n private readonly releaseNotesService: ReleaseNotesService,\n ) {}\n\n runGit(cmd: string): void {\n const { execSync } = require('child_process');\n try {\n const output = execSync(cmd, { encoding: 'utf-8', cwd: process.cwd() }).trim();\n process.stdout.write(output ? `\\r\\n${output}\\r\\n\\r\\n` : ` ${colorize('(no output)', 'muted')}\\r\\n`);\n } catch (e) {\n process.stdout.write(`${Colors.red} ${(e as Error).message}${Colors.reset}\\r\\n`);\n }\n }\n\n async cmdCommit(args: string[], smartInput: SmartInput): Promise<void> {\n const msg = args.join(' ');\n if (!msg) {\n await this.generateAndCommit(smartInput);\n } else {\n const { execSync } = require('child_process');\n try {\n execSync('git add -A', { cwd: process.cwd() });\n execSync('git commit -F -', { cwd: process.cwd(), input: `${msg}\\n`, encoding: 'utf-8' });\n } catch {}\n }\n }\n\n private async generateAndCommit(smartInput: SmartInput): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n\n if (!this.commitGenerator.hasChanges()) {\n w(`${Colors.yellow} No changes to commit${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n w(`\\r\\n${Colors.cyan}πŸ€– Analyzing changes...${Colors.reset}\\r\\n`);\n\n const message = await this.commitGenerator.generateCommitMessage();\n if (!message) {\n w(`${Colors.red} Failed to generate commit message${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n w(`\\r\\n${Colors.green}βœ“ Generated:${Colors.reset} ${colorize(message, 'cyan')}\\r\\n\\r\\n`);\n\n const confirm = await smartInput.askChoice('Commit?', [\n { key: 'y', label: 'yes', description: 'Commit with this message' },\n { key: 'n', label: 'no', description: 'Cancel' },\n { key: 'e', label: 'edit', description: 'Edit message' },\n ]);\n\n if (confirm === 'n') {\n w(colorize(' Cancelled\\r\\n\\r\\n', 'muted'));\n return;\n }\n\n let finalMessage = message;\n\n if (confirm === 'e') {\n const newMsg = await smartInput.question(colorize(' Message: ', 'cyan'));\n if (!newMsg.trim()) {\n w(colorize(' Cancelled\\r\\n\\r\\n', 'muted'));\n return;\n }\n finalMessage = newMsg.trim();\n }\n\n const success = this.commitGenerator.executeCommit(finalMessage);\n if (success) {\n w(`${Colors.green}βœ“ Committed${Colors.reset}\\r\\n\\r\\n`);\n } else {\n w(`${Colors.red}βœ— Commit failed${Colors.reset}\\r\\n\\r\\n`);\n }\n }\n\n async cmdUp(smartInput: SmartInput): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n\n if (!this.commitGenerator.hasChanges()) {\n w(`${Colors.yellow} No changes to commit${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n const monorepoInfo = this.monorepoDetector.detectMonorepo(process.cwd());\n if (monorepoInfo.isMonorepo) {\n w(`\\r\\n${colorize('Monorepo:', 'muted')} ${monorepoInfo.modules.join(', ')}\\r\\n`);\n }\n\n w(`\\r\\n${Colors.cyan}πŸ€– Analyzing changes...${Colors.reset}\\r\\n`);\n\n const message = await this.commitGenerator.generateCommitMessage();\n if (!message) {\n w(`${Colors.red} Failed to generate commit message${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n w(`\\r\\n${Colors.green}βœ“ Generated:${Colors.reset}\\r\\n ${colorize(message, 'cyan')}\\r\\n\\r\\n`);\n\n const confirm = await smartInput.askChoice('Confirm and push?', [\n { key: 'y', label: 'yes', description: 'Commit and push' },\n { key: 'n', label: 'no', description: 'Cancel' },\n { key: 'e', label: 'edit', description: 'Edit message' },\n ]);\n\n if (confirm === 'n') {\n w(colorize(' Cancelled\\r\\n\\r\\n', 'muted'));\n return;\n }\n\n let finalMessage = message;\n\n if (confirm === 'e') {\n const instructions = await smartInput.question(colorize(' Instructions for AI: ', 'cyan'));\n if (!instructions.trim()) {\n w(colorize(' Cancelled\\r\\n\\r\\n', 'muted'));\n return;\n }\n\n w(`\\r\\n${Colors.cyan}πŸ€– Regenerating...${Colors.reset}\\r\\n`);\n const diffInfo = this.commitGenerator.getDiffInfo();\n if (diffInfo) {\n const refined = await this.commitGenerator.refineCommitMessage(message, instructions.trim(), diffInfo);\n w(`\\r\\n${Colors.green}βœ“ Refined:${Colors.reset}\\r\\n ${colorize(refined, 'cyan')}\\r\\n\\r\\n`);\n\n const confirmRefined = await smartInput.askChoice('Use this?', [\n { key: 'y', label: 'yes', description: 'Commit and push' },\n { key: 'n', label: 'no', description: 'Cancel' },\n ]);\n\n if (confirmRefined === 'n') {\n w(colorize(' Cancelled\\r\\n\\r\\n', 'muted'));\n return;\n }\n finalMessage = refined;\n }\n }\n\n w(colorize(' Committing...\\r\\n', 'muted'));\n const commitSuccess = this.commitGenerator.executeCommit(finalMessage, true);\n if (!commitSuccess) {\n w(`${Colors.red} βœ— Commit failed${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n w(`${Colors.green} βœ“ Committed${Colors.reset}\\r\\n`);\n w(colorize(' Pushing...\\r\\n', 'muted'));\n\n const pushResult = this.commitGenerator.executePush();\n if (pushResult.success) {\n w(`${Colors.green} βœ“ Pushed${Colors.reset}\\r\\n\\r\\n`);\n } else {\n w(`${Colors.red} βœ— Push failed:${Colors.reset} ${pushResult.error}\\r\\n\\r\\n`);\n }\n }\n\n async cmdSplitUp(smartInput: SmartInput): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n\n if (!this.commitGenerator.hasChanges()) {\n w(`${Colors.yellow} No changes to commit${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n w(`\\r\\n${Colors.cyan}πŸ€– Analyzing for split...${Colors.reset}\\r\\n`);\n\n const proposedCommits = await this.commitGenerator.splitCommits();\n const commits = (proposedCommits || []).filter(c => c.files && c.files.length > 0);\n\n if (commits.length === 0) {\n w(`${Colors.red} Failed to split commits${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n w(`\\r\\n${Colors.green}βœ“ Proposed ${commits.length} commits:${Colors.reset}\\r\\n\\r\\n`);\n \n for (let i = 0; i < commits.length; i++) {\n const commit = commits[i];\n w(` ${colorize((i + 1).toString() + '.', 'cyan')} ${commit.message}\\r\\n`);\n w(` ${colorize('Files: ' + commit.files.join(', '), 'muted')}\\r\\n`);\n }\n\n w('\\r\\n');\n\n const confirm = await smartInput.askChoice('Execute these commits?', [\n { key: 'y', label: 'yes', description: `Commit all ${commits.length}` },\n { key: 'n', label: 'no', description: 'Cancel' },\n ]);\n\n if (confirm !== 'y') {\n w(colorize(' Cancelled\\r\\n\\r\\n', 'muted'));\n return;\n }\n\n w(colorize(' Executing...\\r\\n', 'muted'));\n const result = this.commitGenerator.executeSplitCommits(commits);\n\n if (result.success) {\n w(`${Colors.green} βœ“ ${result.committed} commits executed${Colors.reset}\\r\\n\\r\\n`);\n\n const { execSync } = require('child_process');\n try {\n const log = execSync(`git log --oneline -${result.committed}`, { cwd: process.cwd(), encoding: 'utf-8' });\n w(colorize(' Commits criados:\\r\\n', 'bold'));\n log.split('\\n').filter(l => l.trim()).forEach((line: string) => {\n w(` ${colorize(line, 'muted')}\\r\\n`);\n });\n w('\\r\\n');\n } catch {}\n\n w(colorize(' Pushing...\\r\\n', 'muted'));\n const pushResult = this.commitGenerator.executePush();\n\n if (pushResult.success) {\n w(`${Colors.green} βœ“ Pushed${Colors.reset}\\r\\n\\r\\n`);\n } else {\n w(`${Colors.red} βœ— Push failed:${Colors.reset} ${pushResult.error}\\r\\n\\r\\n`);\n }\n } else {\n w(`${Colors.red} βœ— Failed after ${result.committed} commit(s):${Colors.reset} ${result.error}\\r\\n`);\n\n if (result.originalHead && result.committed > 0) {\n w(`${colorize(' Rollback disponΓ­vel:', 'warning')}\\r\\n`);\n w(` ${colorize(`git reset --soft ${result.originalHead}`, 'cyan')}\\r\\n\\r\\n`);\n } else {\n w('\\r\\n');\n }\n }\n }\n\n async cmdPr(smartInput: SmartInput): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n\n const branch = this.prGenerator.getCurrentBranch();\n if (branch === 'main' || branch === 'master' || branch === 'develop') {\n w(`${Colors.yellow} Cannot create PR from ${branch} branch${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n const detectedBase = this.prGenerator.detectDefaultBaseBranch();\n const baseInput = await smartInput.question(colorize(` Base branch (default: ${detectedBase}): `, 'cyan'));\n const baseBranch = baseInput.trim() || detectedBase;\n\n w(`\\r\\n${Colors.cyan}πŸ” Analyzing commits...${Colors.reset}\\r\\n`);\n\n const commits = this.prGenerator.getCommitsNotInBase(baseBranch);\n if (commits.length === 0) {\n w(`${Colors.yellow} No commits found between ${branch} and ${baseBranch}${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n w(`\\r\\n${Colors.green}βœ“ Found ${commits.length} commit(s):${Colors.reset}\\r\\n`);\n for (const commit of commits) {\n w(` ${colorize(commit.hash.slice(0, 7), 'muted')} ${commit.message.slice(0, 50)}${commit.message.length > 50 ? '...' : ''}\\r\\n`);\n }\n\n w(`\\r\\n${Colors.cyan}πŸ€– Generating PR description...${Colors.reset}\\r\\n`);\n\n const prDescription = await this.prGenerator.generatePRDescription(branch, commits, baseBranch);\n\n w(`\\r\\n${colorize('─'.repeat(50), 'subtle')}\\r\\n`);\n w(colorize('Pull Request Preview:', 'bold') + '\\r\\n');\n w(colorize('─'.repeat(50), 'subtle') + '\\r\\n\\r\\n');\n w(`${colorize('Title:', 'bold')}\\r\\n ${colorize(prDescription.title, 'cyan')}\\r\\n\\r\\n`);\n \n const descLines = prDescription.description.split('\\n');\n for (const line of descLines.slice(0, 25)) {\n w(` ${line}\\r\\n`);\n }\n if (descLines.length > 25) {\n w(` ${colorize(`... (${descLines.length - 25} more lines)`, 'muted')}\\r\\n`);\n }\n \n w(`\\r\\n${colorize('─'.repeat(50), 'subtle')}\\r\\n\\r\\n`);\n\n const confirm = await smartInput.askChoice('Create this PR?', [\n { key: 'y', label: 'yes', description: 'Create PR on GitHub' },\n { key: 'n', label: 'no', description: 'Cancel' },\n { key: 'e', label: 'edit', description: 'Edit title/description' },\n ]);\n\n if (confirm === 'n') {\n w(colorize(' Cancelled\\r\\n\\r\\n', 'muted'));\n return;\n }\n\n let finalTitle = prDescription.title;\n let finalDescription = prDescription.description;\n\n if (confirm === 'e') {\n const newTitle = await smartInput.question(colorize(' Title (empty to keep): ', 'cyan'));\n if (newTitle.trim()) {\n finalTitle = newTitle.trim();\n }\n\n const editDesc = await smartInput.askChoice('Edit description?', [\n { key: 'y', label: 'yes', description: 'Open in editor' },\n { key: 'n', label: 'no', description: 'Keep as is' },\n ]);\n\n if (editDesc === 'y') {\n const fs = require('fs');\n const { execSync } = require('child_process');\n const tempFile = `/tmp/pr-desc-${Date.now()}.md`;\n fs.writeFileSync(tempFile, finalDescription);\n \n const editor = process.env.EDITOR || 'nano';\n try {\n execSync(`${editor} \"${tempFile}\"`, { stdio: 'inherit' });\n finalDescription = fs.readFileSync(tempFile, 'utf-8');\n } catch {\n w(colorize(' Could not open editor\\r\\n', 'yellow'));\n } finally {\n try { fs.unlinkSync(tempFile); } catch {}\n }\n }\n }\n\n const { platform } = this.prGenerator.detectPlatform();\n \n if (platform === 'github') {\n try {\n const { execSync } = require('child_process');\n execSync(`git push origin ${branch}`, { cwd: process.cwd() });\n } catch {}\n }\n\n const result = await this.prGenerator.createPR(finalTitle, finalDescription, baseBranch);\n\n if (result.success && result.url) {\n w(`\\r\\n${Colors.green}βœ“ Pull Request created!${Colors.reset}\\r\\n`);\n w(` ${colorize(result.url, 'cyan')}\\r\\n\\r\\n`);\n } else {\n if (result.description) {\n const copied = this.prGenerator.copyToClipboard(result.description);\n w(`\\r\\n${colorize('PR Description:', 'bold')}\\r\\n`);\n w(colorize('─'.repeat(50), 'subtle') + '\\r\\n');\n w(result.description.split('\\n').slice(0, 30).join('\\r\\n') + '\\r\\n');\n w(colorize('─'.repeat(50), 'subtle') + '\\r\\n\\r\\n');\n \n if (copied) {\n w(`${colorize('βœ“', 'success')} Copied to clipboard\\r\\n`);\n }\n\n const createUrl = this.prGenerator.getPRCreateUrl(platform, baseBranch);\n if (createUrl) {\n w(`\\r\\n ${colorize('Open to create PR:', 'muted')}\\r\\n`);\n w(` ${colorize(createUrl, 'cyan')}\\r\\n`);\n }\n }\n w('\\r\\n');\n }\n }\n\n async cmdReview(args: string[]): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n\n let files: string[] = [];\n \n if (args.length > 0) {\n files = args.filter(a => !a.startsWith('/'));\n } else {\n w(`\\r\\n${Colors.cyan}πŸ” Analyzing staged files...${Colors.reset}\\r\\n`);\n files = this.codeReviewService['getChangedFiles'](true);\n }\n\n if (files.length === 0) {\n w(`${Colors.yellow} No files to review${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n w(`\\r\\n${Colors.cyan}πŸ€– Reviewing ${files.length} file(s)...${Colors.reset}\\r\\n`);\n\n const results = await this.codeReviewService.reviewFiles(files);\n\n let totalIssues = 0;\n let totalScore = 0;\n\n for (const result of results) {\n totalScore += result.score;\n const errors = result.issues.filter(i => i.severity === 'error').length;\n const warnings = result.issues.filter(i => i.severity === 'warning').length;\n const suggestions = result.issues.filter(i => i.severity === 'suggestion').length;\n totalIssues += result.issues.length;\n\n const scoreColor = result.score >= 80 ? 'success' : result.score >= 60 ? 'warning' : 'error';\n \n w(`\\r\\n${colorize(result.file, 'bold')} ${colorize(result.score + '/100', scoreColor)}\\r\\n`);\n w(` ${colorize(result.summary, 'muted')}\\r\\n`);\n\n if (errors > 0) w(` ${colorize('βœ— ' + errors + ' errors', 'error')} `);\n if (warnings > 0) w(`${colorize('⚠ ' + warnings + ' warnings', 'warning')} `);\n if (suggestions > 0) w(`${colorize('πŸ’‘ ' + suggestions + ' suggestions', 'muted')}`);\n if (errors > 0 || warnings > 0 || suggestions > 0) w('\\r\\n');\n\n const topIssues = result.issues.filter(i => i.severity !== 'praise').slice(0, 3);\n for (const issue of topIssues) {\n const icon = issue.severity === 'error' ? 'βœ—' : issue.severity === 'warning' ? '⚠' : 'πŸ’‘';\n const color = issue.severity === 'error' ? 'error' : issue.severity === 'warning' ? 'warning' : 'muted';\n const line = issue.line ? colorize(':' + issue.line, 'muted') : '';\n w(` ${colorize(icon, color)} ${issue.message}${line}\\r\\n`);\n }\n\n if (result.issues.length > 3) {\n w(` ${colorize('... and ' + (result.issues.length - 3) + ' more', 'muted')}\\r\\n`);\n }\n }\n\n const avgScore = Math.round(totalScore / results.length);\n const avgColor = avgScore >= 80 ? 'success' : avgScore >= 60 ? 'warning' : 'error';\n \n w(`\\r\\n${colorize('Summary:', 'bold')} ${colorize(avgScore + '/100', avgColor)} | ${totalIssues} issue(s)\\r\\n\\r\\n`);\n }\n\n async cmdFix(args: string[]): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n\n if (args.length === 0) {\n w(`${Colors.yellow} Usage: /fix <file>${Colors.reset}\\r\\n\\r\\n`);\n return;\n }\n\n const filePath = args[0];\n w(`\\r\\n${Colors.cyan}πŸ”§ Fixing ${filePath}...${Colors.reset}\\r\\n`);\n\n const result = await this.codeReviewService.fixFile(filePath);\n\n if (result.success) {\n w(`${Colors.green} βœ“ File fixed${Colors.reset}\\r\\n\\r\\n`);\n } else {\n w(`${Colors.red} βœ— Failed: ${result.error}${Colors.reset}\\r\\n\\r\\n`);\n }\n }\n\n async cmdIdent(): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n w(`\\r\\n${Colors.cyan}🎨 Formatting code files...${Colors.reset}\\r\\n`);\n\n const result = await this.codeReviewService.indentAll();\n\n w(`${Colors.green} βœ“ ${result.success} file(s) formatted${Colors.reset}\\r\\n`);\n if (result.failed > 0) {\n w(`${Colors.yellow} ⚠ ${result.failed} file(s) failed${Colors.reset}\\r\\n`);\n }\n w('\\r\\n');\n }\n\n async cmdRelease(args: string[]): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n const sinceTag = args[0];\n\n w(`\\r\\n${Colors.cyan}πŸ“ Generating release notes...${Colors.reset}\\r\\n`);\n\n const result = await this.releaseNotesService.generateReleaseNotes(sinceTag);\n\n if (result.success && result.filePath) {\n w(`${Colors.green} βœ“ Release notes generated!${Colors.reset}\\r\\n`);\n w(` ${colorize(result.filePath, 'accent')}\\r\\n\\r\\n`);\n\n if (result.content) {\n w(`${colorize('Preview:', 'bold')}\\r\\n`);\n const lines = result.content.split('\\n').slice(0, 15);\n for (const line of lines) {\n w(` ${line}\\r\\n`);\n }\n if (result.content.split('\\n').length > 15) {\n w(` ${colorize('...', 'muted')}\\r\\n`);\n }\n w('\\r\\n');\n }\n } else {\n w(`${Colors.red} βœ— Failed: ${result.error}${Colors.reset}\\r\\n\\r\\n`);\n }\n }\n}\n"],"names":["GitCommandsService","runGit","cmd","execSync","require","output","encoding","cwd","process","trim","stdout","write","colorize","e","Colors","red","message","reset","cmdCommit","args","smartInput","msg","join","generateAndCommit","input","w","s","commitGenerator","hasChanges","yellow","cyan","generateCommitMessage","green","confirm","askChoice","key","label","description","finalMessage","newMsg","question","success","executeCommit","cmdUp","monorepoInfo","monorepoDetector","detectMonorepo","isMonorepo","modules","instructions","diffInfo","getDiffInfo","refined","refineCommitMessage","confirmRefined","commitSuccess","pushResult","executePush","error","cmdSplitUp","proposedCommits","splitCommits","commits","filter","c","files","length","i","commit","toString","result","executeSplitCommits","committed","log","split","l","forEach","line","originalHead","cmdPr","branch","prGenerator","getCurrentBranch","detectedBase","detectDefaultBaseBranch","baseInput","baseBranch","getCommitsNotInBase","hash","slice","prDescription","generatePRDescription","repeat","title","descLines","finalTitle","finalDescription","newTitle","editDesc","fs","tempFile","Date","now","writeFileSync","editor","env","EDITOR","stdio","readFileSync","unlinkSync","platform","detectPlatform","createPR","url","copied","copyToClipboard","createUrl","getPRCreateUrl","cmdReview","a","startsWith","codeReviewService","results","reviewFiles","totalIssues","totalScore","score","errors","issues","severity","warnings","suggestions","scoreColor","file","summary","topIssues","issue","icon","color","avgScore","Math","round","avgColor","cmdFix","filePath","fixFile","cmdIdent","indentAll","failed","cmdRelease","sinceTag","releaseNotesService","generateReleaseNotes","content","lines"],"mappings":"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"}