git-smart-flow 0.3.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 (190) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +21 -0
  3. package/README.md +130 -0
  4. package/bin/git-smart-flow.js +2 -0
  5. package/bin/gsf.js +2 -0
  6. package/bin/gsfc.js +3 -0
  7. package/bin/gsfm.js +3 -0
  8. package/bin/gsfp.js +3 -0
  9. package/bin/gsfpr.js +3 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +214 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/commands/aliases.d.ts +2 -0
  14. package/dist/commands/aliases.js +37 -0
  15. package/dist/commands/aliases.js.map +1 -0
  16. package/dist/commands/branch.d.ts +2 -0
  17. package/dist/commands/branch.js +414 -0
  18. package/dist/commands/branch.js.map +1 -0
  19. package/dist/commands/commit-message.d.ts +7 -0
  20. package/dist/commands/commit-message.js +95 -0
  21. package/dist/commands/commit-message.js.map +1 -0
  22. package/dist/commands/commit.d.ts +3 -0
  23. package/dist/commands/commit.js +597 -0
  24. package/dist/commands/commit.js.map +1 -0
  25. package/dist/commands/config.d.ts +2 -0
  26. package/dist/commands/config.js +88 -0
  27. package/dist/commands/config.js.map +1 -0
  28. package/dist/commands/doctor.d.ts +2 -0
  29. package/dist/commands/doctor.js +246 -0
  30. package/dist/commands/doctor.js.map +1 -0
  31. package/dist/commands/info.d.ts +2 -0
  32. package/dist/commands/info.js +155 -0
  33. package/dist/commands/info.js.map +1 -0
  34. package/dist/commands/install-hooks.d.ts +2 -0
  35. package/dist/commands/install-hooks.js +66 -0
  36. package/dist/commands/install-hooks.js.map +1 -0
  37. package/dist/commands/log.d.ts +2 -0
  38. package/dist/commands/log.js +101 -0
  39. package/dist/commands/log.js.map +1 -0
  40. package/dist/commands/menu.d.ts +2 -0
  41. package/dist/commands/menu.js +297 -0
  42. package/dist/commands/menu.js.map +1 -0
  43. package/dist/commands/merge.d.ts +6 -0
  44. package/dist/commands/merge.js +128 -0
  45. package/dist/commands/merge.js.map +1 -0
  46. package/dist/commands/pr.d.ts +2 -0
  47. package/dist/commands/pr.js +731 -0
  48. package/dist/commands/pr.js.map +1 -0
  49. package/dist/commands/push.d.ts +7 -0
  50. package/dist/commands/push.js +225 -0
  51. package/dist/commands/push.js.map +1 -0
  52. package/dist/commands/reflog.d.ts +2 -0
  53. package/dist/commands/reflog.js +162 -0
  54. package/dist/commands/reflog.js.map +1 -0
  55. package/dist/commands/repo-init.d.ts +2 -0
  56. package/dist/commands/repo-init.js +466 -0
  57. package/dist/commands/repo-init.js.map +1 -0
  58. package/dist/commands/revert.d.ts +7 -0
  59. package/dist/commands/revert.js +694 -0
  60. package/dist/commands/revert.js.map +1 -0
  61. package/dist/commands/setup.d.ts +2 -0
  62. package/dist/commands/setup.js +86 -0
  63. package/dist/commands/setup.js.map +1 -0
  64. package/dist/commands/stash.d.ts +2 -0
  65. package/dist/commands/stash.js +130 -0
  66. package/dist/commands/stash.js.map +1 -0
  67. package/dist/commands/sync.d.ts +2 -0
  68. package/dist/commands/sync.js +335 -0
  69. package/dist/commands/sync.js.map +1 -0
  70. package/dist/commands/tag.d.ts +2 -0
  71. package/dist/commands/tag.js +163 -0
  72. package/dist/commands/tag.js.map +1 -0
  73. package/dist/commands/validate.d.ts +2 -0
  74. package/dist/commands/validate.js +203 -0
  75. package/dist/commands/validate.js.map +1 -0
  76. package/dist/config/config.d.ts +10 -0
  77. package/dist/config/config.js +126 -0
  78. package/dist/config/config.js.map +1 -0
  79. package/dist/git/ai-context-builder.d.ts +11 -0
  80. package/dist/git/ai-context-builder.js +112 -0
  81. package/dist/git/ai-context-builder.js.map +1 -0
  82. package/dist/git/convention-detector.d.ts +3 -0
  83. package/dist/git/convention-detector.js +211 -0
  84. package/dist/git/convention-detector.js.map +1 -0
  85. package/dist/git/ensure-repo.d.ts +7 -0
  86. package/dist/git/ensure-repo.js +141 -0
  87. package/dist/git/ensure-repo.js.map +1 -0
  88. package/dist/git/gitignore.d.ts +8 -0
  89. package/dist/git/gitignore.js +261 -0
  90. package/dist/git/gitignore.js.map +1 -0
  91. package/dist/git/remote-setup.d.ts +2 -0
  92. package/dist/git/remote-setup.js +129 -0
  93. package/dist/git/remote-setup.js.map +1 -0
  94. package/dist/git/repo.d.ts +73 -0
  95. package/dist/git/repo.js +308 -0
  96. package/dist/git/repo.js.map +1 -0
  97. package/dist/git/validate.d.ts +36 -0
  98. package/dist/git/validate.js +113 -0
  99. package/dist/git/validate.js.map +1 -0
  100. package/dist/providers/base.provider.d.ts +10 -0
  101. package/dist/providers/base.provider.js +40 -0
  102. package/dist/providers/base.provider.js.map +1 -0
  103. package/dist/providers/claude.provider.d.ts +14 -0
  104. package/dist/providers/claude.provider.js +85 -0
  105. package/dist/providers/claude.provider.js.map +1 -0
  106. package/dist/providers/copilot.provider.d.ts +12 -0
  107. package/dist/providers/copilot.provider.js +88 -0
  108. package/dist/providers/copilot.provider.js.map +1 -0
  109. package/dist/providers/heuristic.provider.d.ts +9 -0
  110. package/dist/providers/heuristic.provider.js +163 -0
  111. package/dist/providers/heuristic.provider.js.map +1 -0
  112. package/dist/providers/ollama.provider.d.ts +14 -0
  113. package/dist/providers/ollama.provider.js +83 -0
  114. package/dist/providers/ollama.provider.js.map +1 -0
  115. package/dist/providers/openai.provider.d.ts +14 -0
  116. package/dist/providers/openai.provider.js +84 -0
  117. package/dist/providers/openai.provider.js.map +1 -0
  118. package/dist/providers/provider.factory.d.ts +5 -0
  119. package/dist/providers/provider.factory.js +51 -0
  120. package/dist/providers/provider.factory.js.map +1 -0
  121. package/dist/security/scanner.d.ts +13 -0
  122. package/dist/security/scanner.js +138 -0
  123. package/dist/security/scanner.js.map +1 -0
  124. package/dist/types/index.d.ts +146 -0
  125. package/dist/types/index.js +2 -0
  126. package/dist/types/index.js.map +1 -0
  127. package/dist/ux/components/BranchTree.d.ts +8 -0
  128. package/dist/ux/components/BranchTree.js +57 -0
  129. package/dist/ux/components/BranchTree.js.map +1 -0
  130. package/dist/ux/components/CommitProposal.d.ts +13 -0
  131. package/dist/ux/components/CommitProposal.js +127 -0
  132. package/dist/ux/components/CommitProposal.js.map +1 -0
  133. package/dist/ux/components/DiagnosticReport.d.ts +18 -0
  134. package/dist/ux/components/DiagnosticReport.js +19 -0
  135. package/dist/ux/components/DiagnosticReport.js.map +1 -0
  136. package/dist/ux/components/ErrorBox.d.ts +7 -0
  137. package/dist/ux/components/ErrorBox.js +9 -0
  138. package/dist/ux/components/ErrorBox.js.map +1 -0
  139. package/dist/ux/components/FileSelector.d.ts +14 -0
  140. package/dist/ux/components/FileSelector.js +87 -0
  141. package/dist/ux/components/FileSelector.js.map +1 -0
  142. package/dist/ux/components/Logo.d.ts +6 -0
  143. package/dist/ux/components/Logo.js +21 -0
  144. package/dist/ux/components/Logo.js.map +1 -0
  145. package/dist/ux/components/RepoContext.d.ts +8 -0
  146. package/dist/ux/components/RepoContext.js +17 -0
  147. package/dist/ux/components/RepoContext.js.map +1 -0
  148. package/dist/ux/components/SecurityAlert.d.ts +9 -0
  149. package/dist/ux/components/SecurityAlert.js +16 -0
  150. package/dist/ux/components/SecurityAlert.js.map +1 -0
  151. package/dist/ux/components/StatusDashboard.d.ts +14 -0
  152. package/dist/ux/components/StatusDashboard.js +36 -0
  153. package/dist/ux/components/StatusDashboard.js.map +1 -0
  154. package/dist/ux/components/SuccessBox.d.ts +7 -0
  155. package/dist/ux/components/SuccessBox.js +9 -0
  156. package/dist/ux/components/SuccessBox.js.map +1 -0
  157. package/dist/ux/components/ValidationReport.d.ts +16 -0
  158. package/dist/ux/components/ValidationReport.js +19 -0
  159. package/dist/ux/components/ValidationReport.js.map +1 -0
  160. package/dist/ux/components/WarningBox.d.ts +7 -0
  161. package/dist/ux/components/WarningBox.js +9 -0
  162. package/dist/ux/components/WarningBox.js.map +1 -0
  163. package/dist/ux/display.d.ts +21 -0
  164. package/dist/ux/display.js +96 -0
  165. package/dist/ux/display.js.map +1 -0
  166. package/dist/ux/hooks/useActivation.d.ts +8 -0
  167. package/dist/ux/hooks/useActivation.js +16 -0
  168. package/dist/ux/hooks/useActivation.js.map +1 -0
  169. package/dist/ux/hooks/useSpinner.d.ts +2 -0
  170. package/dist/ux/hooks/useSpinner.js +13 -0
  171. package/dist/ux/hooks/useSpinner.js.map +1 -0
  172. package/dist/ux/menu.d.ts +7 -0
  173. package/dist/ux/menu.js +56 -0
  174. package/dist/ux/menu.js.map +1 -0
  175. package/dist/ux/prompt.d.ts +7 -0
  176. package/dist/ux/prompt.js +361 -0
  177. package/dist/ux/prompt.js.map +1 -0
  178. package/dist/ux/renderer.d.ts +9 -0
  179. package/dist/ux/renderer.js +45 -0
  180. package/dist/ux/renderer.js.map +1 -0
  181. package/dist/ux/spinner.d.ts +6 -0
  182. package/dist/ux/spinner.js +42 -0
  183. package/dist/ux/spinner.js.map +1 -0
  184. package/dist/ux/statusbar.d.ts +2 -0
  185. package/dist/ux/statusbar.js +44 -0
  186. package/dist/ux/statusbar.js.map +1 -0
  187. package/dist/ux/theme.d.ts +37 -0
  188. package/dist/ux/theme.js +55 -0
  189. package/dist/ux/theme.js.map +1 -0
  190. package/package.json +125 -0
@@ -0,0 +1,87 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { MultiSelect } from '@inkjs/ui';
4
+ import { theme } from '../theme.js';
5
+ import { useActivation } from '../hooks/useActivation.js';
6
+ function statusIcon(status) {
7
+ const map = {
8
+ added: 'A',
9
+ modified: 'M',
10
+ deleted: 'D',
11
+ renamed: 'R',
12
+ copied: 'C',
13
+ unknown: '?',
14
+ untracked: '?',
15
+ unstaged: 'M',
16
+ };
17
+ return map[status] ?? '?';
18
+ }
19
+ function dirOf(filePath) {
20
+ const idx = filePath.lastIndexOf('/');
21
+ return idx >= 0 ? filePath.slice(0, idx) : '';
22
+ }
23
+ function buildOptions(files) {
24
+ const options = [];
25
+ if (files.length >= 2) {
26
+ options.push({ label: `📦 Todos los archivos (${files.length})`, value: '__ALL__' });
27
+ }
28
+ // Group by directory
29
+ const dirs = new Map();
30
+ for (const f of files) {
31
+ const d = dirOf(f.path);
32
+ if (!dirs.has(d))
33
+ dirs.set(d, []);
34
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
35
+ dirs.get(d).push(f);
36
+ }
37
+ const sortedDirs = [...dirs.entries()].sort(([a], [b]) => a.localeCompare(b));
38
+ for (const [dir, dirFiles] of sortedDirs) {
39
+ // Directory shortcut only when the dir has 2+ files
40
+ if (dirFiles.length >= 2) {
41
+ const dirLabel = dir ? `📁 ${dir}/ (${dirFiles.length})` : `📁 (raíz) (${dirFiles.length})`;
42
+ options.push({ label: dirLabel, value: `__DIR:${dir}` });
43
+ }
44
+ for (const f of dirFiles) {
45
+ const indent = dirFiles.length >= 2 ? ' ' : '';
46
+ options.push({
47
+ label: `${indent}${statusIcon(f.status)} ${f.path}`,
48
+ value: f.path,
49
+ });
50
+ }
51
+ }
52
+ return options;
53
+ }
54
+ function expandSelection(selected, allFiles) {
55
+ const paths = new Set();
56
+ for (const val of selected) {
57
+ if (val === '__ALL__') {
58
+ for (const f of allFiles)
59
+ paths.add(f.path);
60
+ }
61
+ else if (val.startsWith('__DIR:')) {
62
+ const dir = val.slice(6);
63
+ for (const f of allFiles) {
64
+ if (dirOf(f.path) === dir)
65
+ paths.add(f.path);
66
+ }
67
+ }
68
+ else {
69
+ paths.add(val);
70
+ }
71
+ }
72
+ return [...paths];
73
+ }
74
+ export function FileSelector({ files, blockedFiles = [], onSelect }) {
75
+ const isActive = useActivation();
76
+ const selectableFiles = files.filter((f) => !blockedFiles.includes(f.path));
77
+ const blocked = files.filter((f) => blockedFiles.includes(f.path));
78
+ const options = buildOptions(selectableFiles);
79
+ function handleSubmit(selected) {
80
+ const paths = expandSelection(selected, selectableFiles);
81
+ if (paths.length === 0)
82
+ return;
83
+ onSelect(paths);
84
+ }
85
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "white", children: "\uD83D\uDCC2 Archivos con cambios" }), _jsx(Text, { color: theme.muted, children: '─'.repeat(40) }), blocked.length > 0 && (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: blocked.map((f, i) => (_jsxs(Text, { color: theme.muted, children: [' ', "\uD83D\uDD12 ", f.path, " ", _jsx(Text, { color: theme.error, children: "(bloqueado - secretos)" })] }, i))) })), _jsx(MultiSelect, { isDisabled: !isActive, options: options, onSubmit: handleSubmit }), _jsx(Text, { color: theme.muted, children: " Espacio para seleccionar \u00B7 Enter para confirmar" })] }));
86
+ }
87
+ //# sourceMappingURL=FileSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileSelector.js","sourceRoot":"","sources":["../../../src/ux/components/FileSelector.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ version: string;
3
+ }
4
+ export declare function Logo({ version }: Props): JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=Logo.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import figlet from 'figlet';
4
+ import { theme } from '../theme.js';
5
+ function renderLogo(narrow) {
6
+ try {
7
+ return figlet.textSync('GSF', { font: narrow ? 'Small' : 'ANSI Shadow' });
8
+ }
9
+ catch {
10
+ return narrow
11
+ ? ' ___ ___ ___ \n/ __|| _|| __|\n|(_ |___ || __|\n \\___||___||___|'
12
+ : ' ██████╗ ███████╗███████╗\n ██╔════╝ ██╔════╝██╔════╝\n ██║ ███╗███████╗█████╗ \n ██║ ██║╚════██║██╔══╝ \n ╚██████╔╝███████║██║ \n ╚═════╝ ╚══════╝╚═╝ ';
13
+ }
14
+ }
15
+ export function Logo({ version }) {
16
+ const cols = process.stdout.columns ?? 80;
17
+ const narrow = cols < 80;
18
+ const art = renderLogo(narrow);
19
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: theme.accent, children: art }), _jsxs(Box, { marginTop: -1, paddingLeft: 2, gap: 1, children: [_jsx(Text, { bold: true, color: "white", children: "Git Smart Flow" }), _jsxs(Text, { color: theme.muted, children: ["v", version] })] }), _jsx(Box, { paddingLeft: 2, children: _jsx(Text, { color: theme.muted, children: "The smart way to use Git" }) })] }));
20
+ }
21
+ //# sourceMappingURL=Logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logo.js","sourceRoot":"","sources":["../../../src/ux/components/Logo.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAMpC,SAAS,UAAU,CAAC,MAAe;IACjC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM;YACX,CAAC,CAAC,qEAAqE;YACvE,CAAC,CAAC,wKAAwK,CAAC;IAC/K,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EAAE,OAAO,EAAS;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,YAAG,GAAG,GAAQ,EACvC,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,aACxC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,+BAEjB,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,kBAAI,OAAO,IAAQ,IACvC,EACN,KAAC,GAAG,IAAC,WAAW,EAAE,CAAC,YACjB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,yCAAiC,GACrD,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RepoContext } from '../../types/index.js';
2
+ interface Props {
3
+ ctx: RepoContext;
4
+ provider?: string;
5
+ }
6
+ export declare function RepoContextBox({ ctx, provider }: Props): JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=RepoContext.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { branchColor, theme } from '../theme.js';
4
+ export function RepoContextBox({ ctx, provider }) {
5
+ const width = Math.min(process.stdout.columns ?? 80, 60);
6
+ const color = branchColor(ctx.branch);
7
+ const isProtected = ctx.branch === 'main' || ctx.branch === 'master' || ctx.branch === 'develop';
8
+ const aheadStr = ctx.aheadCount > 0 ? _jsxs(Text, { color: theme.success, children: [" \u2191", ctx.aheadCount] }) : null;
9
+ const behindStr = ctx.behindCount > 0 ? _jsxs(Text, { color: theme.error, children: [" \u2193", ctx.behindCount] }) : null;
10
+ const conventionName = ctx.convention.type === 'conventional'
11
+ ? 'Conventional'
12
+ : ctx.convention.type === 'angular'
13
+ ? 'Angular'
14
+ : ctx.convention.type;
15
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border, paddingX: 1, width: width, marginBottom: 1, children: [_jsxs(Text, { children: [_jsx(Text, { color: theme.muted, children: "\uD83D\uDCC1 " }), _jsx(Text, { bold: true, color: "white", children: ctx.name })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.muted, children: "\uD83C\uDF3F " }), _jsx(Text, { color: color, children: ctx.branch }), aheadStr, behindStr, isProtected && _jsx(Text, { color: theme.warning, children: " \u26A0 PROTECTED" })] }), _jsxs(Text, { children: [_jsx(Text, { color: theme.muted, children: "\u26A1 " }), _jsx(Text, { color: theme.info, children: conventionName })] }), _jsxs(Text, { children: [_jsx(Text, { color: theme.muted, children: "\uD83E\uDD16 " }), _jsx(Text, { color: theme.muted, children: provider ?? 'Heurístico' })] })] }));
16
+ }
17
+ //# sourceMappingURL=RepoContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepoContext.js","sourceRoot":"","sources":["../../../src/ux/components/RepoContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOjD,MAAM,UAAU,cAAc,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAS;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;IAEjG,MAAM,QAAQ,GACZ,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,wBAAK,GAAG,CAAC,UAAU,IAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,MAAM,SAAS,GACb,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,wBAAK,GAAG,CAAC,WAAW,IAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpF,MAAM,cAAc,GAClB,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,cAAc;QACpC,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS;YACjC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;IAE5B,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,EACzB,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,CAAC,aAEf,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,8BAAY,EACpC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,YACrB,GAAG,CAAC,IAAI,GACJ,IACF,EACP,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,8BAAY,EACpC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,GAAG,CAAC,MAAM,GAAQ,EACtC,QAAQ,EACR,SAAS,EACT,WAAW,IAAI,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,kCAAqB,IAC3D,EACN,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,wBAAW,EACnC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAG,cAAc,GAAQ,IAC3C,EACP,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,8BAAY,EACpC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,QAAQ,IAAI,YAAY,GAAQ,IACtD,IACH,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SecurityScanResult } from '../../types/index.js';
2
+ type SecurityChoice = 'review' | 'continue' | 'cancel';
3
+ interface Props {
4
+ scan: SecurityScanResult;
5
+ onChoice: (choice: SecurityChoice) => void;
6
+ }
7
+ export declare function SecurityAlert({ scan, onChoice }: Props): JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=SecurityAlert.d.ts.map
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { Select } from '@inkjs/ui';
4
+ import { theme } from '../theme.js';
5
+ import { useActivation } from '../hooks/useActivation.js';
6
+ export function SecurityAlert({ scan, onChoice }) {
7
+ const isActive = useActivation();
8
+ const width = Math.min(process.stdout.columns ?? 80, 76);
9
+ const options = [
10
+ { label: 'No, revisar los archivos primero', value: 'review' },
11
+ { label: 'Sí, continuar sin IA para estos archivos', value: 'continue' },
12
+ { label: 'Cancelar', value: 'cancel' },
13
+ ];
14
+ return (_jsxs(Box, { flexDirection: "column", width: width, children: [_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.warning, paddingX: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, color: theme.warning, children: "\u26A0\uFE0F Alerta de seguridad" }), _jsx(Text, { children: " " }), _jsx(Text, { color: "white", children: " Se detectaron posibles secretos en archivos staged:" }), _jsx(Text, { children: " " }), scan.detectedSecrets.map((s, i) => (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsxs(Text, { color: theme.info, children: ["\uD83D\uDCC4 ", s.file] }), _jsxs(Text, { color: theme.muted, children: [' ', "L\u00EDnea ", s.line, ": ", s.pattern.replace(/./g, '•').slice(0, 20)] })] }, i))), scan.blockedFiles.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), scan.blockedFiles.map((f, i) => (_jsx(Box, { marginLeft: 2, children: _jsxs(Text, { color: theme.error, children: ["\uD83D\uDD12 ", f, " (bloqueado)"] }) }, i)))] })), _jsx(Text, { children: " " }), _jsx(Text, { color: theme.muted, children: " Estos archivos NO ser\u00E1n enviados a la IA." })] }), _jsx(Select, { isDisabled: !isActive, options: options, onChange: (val) => onChoice(val) })] }));
15
+ }
16
+ //# sourceMappingURL=SecurityAlert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityAlert.js","sourceRoot":"","sources":["../../../src/ux/components/SecurityAlert.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAS1D,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAS;IACrD,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG;QACd,EAAE,KAAK,EAAE,kCAAkC,EAAE,KAAK,EAAE,QAA0B,EAAE;QAChF,EAAE,KAAK,EAAE,0CAA0C,EAAE,KAAK,EAAE,UAA4B,EAAE;QAC1F,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAA0B,EAAE;KACzD,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,KAAK,aACtC,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,OAAO,EAC1B,QAAQ,EAAE,CAAC,EACX,YAAY,EAAE,CAAC,aAEf,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,CAAC,OAAO,iDAExB,EACP,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,qEAA4D,EAC/E,KAAC,IAAI,oBAAS,EACb,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAClC,MAAC,GAAG,IAAS,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aAC/C,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,8BAAM,CAAC,CAAC,IAAI,IAAQ,EAC3C,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aACrB,GAAG,iBACG,CAAC,CAAC,IAAI,QAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IACrD,KALC,CAAC,CAML,CACP,CAAC,EACD,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAC/B,8BACE,KAAC,IAAI,oBAAS,EACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,KAAC,GAAG,IAAS,UAAU,EAAE,CAAC,YACxB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,8BAAM,CAAC,oBAAoB,IAD3C,CAAC,CAEL,CACP,CAAC,IACD,CACJ,EACD,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,gEAAmD,IACvE,EACN,KAAC,MAAM,IACL,UAAU,EAAE,CAAC,QAAQ,EACrB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAqB,CAAC,GAClD,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { RepoContext } from '../../types/index.js';
2
+ import type { LastCommit } from '../../git/repo.js';
3
+ interface Props {
4
+ ctx: RepoContext;
5
+ lastCommit: LastCommit | null;
6
+ lastFetch: Date | null;
7
+ version: string;
8
+ provider?: string;
9
+ cwd: string;
10
+ graphLimit?: number;
11
+ }
12
+ export declare function StatusDashboard({ ctx, lastCommit, lastFetch, version, provider, cwd, graphLimit, }: Props): JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=StatusDashboard.d.ts.map
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { branchColor, theme } from '../theme.js';
4
+ import { BranchTree } from './BranchTree.js';
5
+ function relativeTime(d) {
6
+ const s = Math.floor((Date.now() - d.getTime()) / 1000);
7
+ if (s < 60)
8
+ return `${s}s ago`;
9
+ if (s < 3600)
10
+ return `${Math.floor(s / 60)}m ago`;
11
+ if (s < 86400)
12
+ return `${Math.floor(s / 3600)}h ago`;
13
+ return `${Math.floor(s / 86400)}d ago`;
14
+ }
15
+ export function StatusDashboard({ ctx, lastCommit, lastFetch, version, provider, cwd, graphLimit = 3, }) {
16
+ const width = Math.min(process.stdout.columns ?? 80, 78);
17
+ const innerWidth = width - 6;
18
+ const brColor = branchColor(ctx.branch);
19
+ const isProtected = ctx.branch === 'main' || ctx.branch === 'master' || ctx.branch === 'develop';
20
+ const conventionName = ctx.convention.type === 'conventional'
21
+ ? 'Conventional'
22
+ : ctx.convention.type === 'angular'
23
+ ? 'Angular'
24
+ : ctx.convention.type;
25
+ const msgTrunc = lastCommit
26
+ ? lastCommit.message.length > 45
27
+ ? lastCommit.message.slice(0, 44) + '…'
28
+ : lastCommit.message
29
+ : null;
30
+ const hasDirty = ctx.conflictsActive ||
31
+ ctx.stagedFiles.length > 0 ||
32
+ ctx.unstagedFiles.length > 0 ||
33
+ ctx.untrackedFiles.length > 0;
34
+ return (_jsxs(Box, { flexDirection: "column", width: width, children: [_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border, paddingX: 1, width: width, marginBottom: 0, children: [_jsxs(Box, { children: [_jsx(Text, { color: theme.muted, children: "\uD83D\uDCC1 " }), _jsx(Text, { bold: true, color: "white", children: ctx.name }), _jsx(Text, { color: theme.muted, children: ' · git-smart-flow v' + version })] }), _jsxs(Box, { children: [_jsx(Text, { color: theme.muted, children: "\uD83C\uDF3F " }), _jsx(Text, { bold: true, color: brColor, children: ctx.branch }), ctx.aheadCount > 0 && _jsxs(Text, { color: theme.success, children: [" \u2191", ctx.aheadCount] }), ctx.behindCount > 0 && _jsxs(Text, { color: theme.error, children: [" \u2193", ctx.behindCount] }), isProtected && _jsx(Text, { color: theme.warning, children: " \u26A0 PROTECTED" }), _jsx(Text, { color: theme.muted, children: ' · ⚡ ' + conventionName }), provider && provider !== 'heuristic' && (_jsx(Text, { color: theme.muted, children: ' · 🤖 ' + provider }))] }), lastCommit ? (_jsxs(Box, { children: [_jsx(Text, { color: theme.muted, children: "\uD83D\uDD50 " }), _jsxs(Text, { color: theme.muted, children: [lastCommit.shortSha, " "] }), _jsxs(Text, { color: "#d1d5db", children: ["\"", msgTrunc, "\""] }), _jsx(Text, { color: theme.muted, children: ' ' + lastCommit.ago })] })) : (_jsxs(Box, { children: [_jsx(Text, { color: theme.muted, children: "\uD83D\uDD50 " }), _jsx(Text, { color: theme.muted, children: "(no commits yet)" })] })), _jsx(Text, { color: theme.border, children: '─'.repeat(innerWidth) }), _jsxs(Box, { children: [ctx.conflictsActive && _jsx(Text, { color: theme.error, children: "\u2716 CONFLICTS " }), ctx.stagedFiles.length > 0 && (_jsx(Text, { color: theme.warning, children: '● ' + ctx.stagedFiles.length + ' staged ' })), ctx.unstagedFiles.length > 0 && (_jsx(Text, { color: theme.warning, children: '△ ' + ctx.unstagedFiles.length + ' modified ' })), ctx.untrackedFiles.length > 0 && (_jsx(Text, { color: theme.muted, children: '○ ' + ctx.untrackedFiles.length + ' untracked ' })), !hasDirty && _jsx(Text, { color: theme.success, children: "\u2714 clean " }), _jsx(Text, { color: theme.muted, children: lastFetch ? '· fetched ' + relativeTime(lastFetch) : '· never fetched' })] })] }), _jsx(BranchTree, { cwd: cwd, limit: graphLimit, showMeta: true })] }));
35
+ }
36
+ //# sourceMappingURL=StatusDashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusDashboard.js","sourceRoot":"","sources":["../../../src/ux/components/StatusDashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ title?: string;
3
+ messages: string | string[];
4
+ }
5
+ export declare function SuccessBox({ title, messages }: Props): JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=SuccessBox.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { theme } from '../theme.js';
4
+ export function SuccessBox({ title = '✅ Éxito', messages }) {
5
+ const lines = Array.isArray(messages) ? messages : [messages];
6
+ const width = Math.min(process.stdout.columns ?? 80, 78);
7
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "double", borderColor: theme.success, paddingX: 1, width: width, children: [_jsx(Text, { bold: true, color: theme.success, children: title }), _jsx(Text, { children: " " }), lines.map((line, i) => (_jsxs(Text, { color: "white", children: [' ', line] }, i)))] }));
8
+ }
9
+ //# sourceMappingURL=SuccessBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuccessBox.js","sourceRoot":"","sources":["../../../src/ux/components/SuccessBox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOpC,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,QAAQ,EAAS;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzD,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,KAAK,CAAC,OAAO,EAC1B,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,KAAK,aAEZ,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,CAAC,OAAO,YAC5B,KAAK,GACD,EACP,KAAC,IAAI,oBAAS,EACb,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,MAAC,IAAI,IAAS,KAAK,EAAC,OAAO,aACxB,GAAG,EACH,IAAI,KAFI,CAAC,CAGL,CACR,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ValidationItem {
2
+ status: 'ok' | 'warn' | 'error' | 'info';
3
+ label: string;
4
+ detail?: string;
5
+ }
6
+ export interface ValidationSection {
7
+ title: string;
8
+ items: ValidationItem[];
9
+ }
10
+ interface Props {
11
+ repoName: string;
12
+ sections: ValidationSection[];
13
+ }
14
+ export declare function ValidationReport({ repoName, sections }: Props): JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=ValidationReport.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { theme } from '../theme.js';
4
+ function StatusIcon({ status }) {
5
+ const map = {
6
+ ok: _jsx(Text, { color: theme.success, children: "\u2705" }),
7
+ warn: _jsx(Text, { color: theme.warning, children: "\u26A0\uFE0F " }),
8
+ error: _jsx(Text, { color: theme.error, children: "\u274C" }),
9
+ info: _jsx(Text, { color: theme.info, children: "\u2139 " }),
10
+ };
11
+ return map[status];
12
+ }
13
+ export function ValidationReport({ repoName, sections }) {
14
+ const width = Math.min(process.stdout.columns ?? 80, 78);
15
+ const divider = '─'.repeat(Math.min(width - 2, 46));
16
+ const allOk = sections.every((s) => s.items.every((i) => i.status === 'ok' || i.status === 'info'));
17
+ return (_jsxs(Box, { flexDirection: "column", width: width, children: [_jsxs(Text, { bold: true, color: "white", children: ["Validaci\u00F3n del repositorio \u2014 ", repoName] }), _jsx(Text, { color: theme.muted, children: '━'.repeat(Math.min(repoName.length + 30, width - 2)) }), _jsx(Text, { children: " " }), sections.map((sec) => (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "#d1d5db", children: sec.title }), _jsx(Text, { color: theme.muted, children: divider }), sec.items.map((item, i) => (_jsxs(Box, { gap: 1, children: [_jsx(StatusIcon, { status: item.status }), _jsx(Text, { color: "white", children: item.label }), item.detail && _jsx(Text, { color: theme.muted, children: item.detail })] }, i)))] }, sec.title))), _jsx(Box, { marginTop: 1, children: allOk ? (_jsx(Text, { bold: true, color: theme.success, children: "\u2714 Sin problemas detectados" })) : (_jsx(Text, { bold: true, color: theme.warning, children: "\u26A0 Revisa los elementos marcados antes de continuar" })) })] }));
18
+ }
19
+ //# sourceMappingURL=ValidationReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationReport.js","sourceRoot":"","sources":["../../../src/ux/components/ValidationReport.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ title?: string;
3
+ messages: string | string[];
4
+ }
5
+ export declare function WarningBox({ title, messages }: Props): JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=WarningBox.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { theme } from '../theme.js';
4
+ export function WarningBox({ title = '⚠️ Atención', messages }) {
5
+ const lines = Array.isArray(messages) ? messages : [messages];
6
+ const width = Math.min(process.stdout.columns ?? 80, 78);
7
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "double", borderColor: theme.warning, paddingX: 1, width: width, children: [_jsx(Text, { bold: true, color: theme.warning, children: title }), _jsx(Text, { children: " " }), lines.map((line, i) => (_jsxs(Text, { color: "white", children: [' ', line] }, i)))] }));
8
+ }
9
+ //# sourceMappingURL=WarningBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarningBox.js","sourceRoot":"","sources":["../../../src/ux/components/WarningBox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOpC,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,GAAG,cAAc,EAAE,QAAQ,EAAS;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzD,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,KAAK,CAAC,OAAO,EAC1B,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,KAAK,aAEZ,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,CAAC,OAAO,YAC5B,KAAK,GACD,EACP,KAAC,IAAI,oBAAS,EACb,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,MAAC,IAAI,IAAS,KAAK,EAAC,OAAO,aACxB,GAAG,EACH,IAAI,KAFI,CAAC,CAGL,CACR,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare function success(msg: string): void;
2
+ export declare function error(msg: string): void;
3
+ export declare function warning(msg: string): void;
4
+ export declare function info(msg: string): void;
5
+ export declare function secondary(msg: string): void;
6
+ export declare function section(title: string): void;
7
+ export declare function keyValue(key: string, value: string, indent?: number): void;
8
+ export declare function table(rows: Array<[string, string]>): void;
9
+ export declare function blank(): void;
10
+ export declare function header(title: string, version: string): void;
11
+ export declare function divider(): void;
12
+ export declare function printSuccess(msg: string): void;
13
+ export declare function printError(msg: string): void;
14
+ export declare function printWarning(msg: string): void;
15
+ export declare function printInfo(msg: string): void;
16
+ export declare function printSection(title: string): void;
17
+ export declare function printItem(status: 'ok' | 'warn' | 'error' | 'info', label: string, value?: string): void;
18
+ export declare function printErrorBox(title: string, ...lines: string[]): void;
19
+ export declare function printSuccessBox(title: string, ...lines: string[]): void;
20
+ export declare function printWarningBox(title: string, ...lines: string[]): void;
21
+ //# sourceMappingURL=display.d.ts.map
@@ -0,0 +1,96 @@
1
+ import chalk from 'chalk';
2
+ import boxen from 'boxen';
3
+ // ── Legacy helpers (backward-compatible with existing commands) ────────────
4
+ export function success(msg) {
5
+ console.log(chalk.green('✔ ' + msg));
6
+ }
7
+ export function error(msg) {
8
+ console.error(chalk.red('✖ ' + msg));
9
+ }
10
+ export function warning(msg) {
11
+ console.warn(chalk.yellow('⚠ ' + msg));
12
+ }
13
+ export function info(msg) {
14
+ console.log(chalk.blue('ℹ ' + msg));
15
+ }
16
+ export function secondary(msg) {
17
+ console.log(chalk.gray(msg));
18
+ }
19
+ export function section(title) {
20
+ console.log('\n' + chalk.bold.cyan('── ' + title + ' ──'));
21
+ }
22
+ export function keyValue(key, value, indent = 0) {
23
+ const pad = ' '.repeat(indent);
24
+ console.log(`${pad}${chalk.gray(key + ':')} ${chalk.white(value)}`);
25
+ }
26
+ export function table(rows) {
27
+ const maxKey = Math.max(...rows.map(([k]) => k.length));
28
+ for (const [k, v] of rows) {
29
+ console.log(` ${chalk.gray(k.padEnd(maxKey))} ${chalk.white(v)}`);
30
+ }
31
+ }
32
+ export function blank() {
33
+ console.log();
34
+ }
35
+ export function header(title, version) {
36
+ console.log(chalk.bold.cyan(`\n Git Smart Flow ${chalk.white(`v${version}`)}\n`));
37
+ if (title)
38
+ console.log(chalk.gray(` ${title}\n`));
39
+ }
40
+ export function divider() {
41
+ console.log(chalk.gray('─'.repeat(50)));
42
+ }
43
+ // ── New semantic helpers (for CI/pipe-safe output) ─────────────────────────
44
+ export function printSuccess(msg) {
45
+ console.log(chalk.green('✔') + ' ' + msg);
46
+ }
47
+ export function printError(msg) {
48
+ console.error(chalk.red('✖') + ' ' + msg);
49
+ }
50
+ export function printWarning(msg) {
51
+ console.warn(chalk.yellow('⚠') + ' ' + msg);
52
+ }
53
+ export function printInfo(msg) {
54
+ console.log(chalk.blue('ℹ') + ' ' + msg);
55
+ }
56
+ export function printSection(title) {
57
+ const width = Math.min(process.stdout.columns ?? 80, 80);
58
+ const line = '─'.repeat(Math.max(0, width - title.length - 4));
59
+ console.log('\n' + chalk.bold(title) + ' ' + chalk.gray(line));
60
+ }
61
+ export function printItem(status, label, value) {
62
+ const icons = {
63
+ ok: chalk.green('✅'),
64
+ warn: chalk.yellow('⚠️ '),
65
+ error: chalk.red('❌'),
66
+ info: chalk.blue('──'),
67
+ };
68
+ const icon = icons[status];
69
+ const val = value ? ' ' + chalk.gray(value) : '';
70
+ console.log(` ${icon} ${label}${val}`);
71
+ }
72
+ export function printErrorBox(title, ...lines) {
73
+ const content = lines.join('\n');
74
+ console.error(boxen(`${chalk.bold.red(title)}\n\n${content}`, {
75
+ padding: 1,
76
+ borderStyle: 'double',
77
+ borderColor: 'red',
78
+ }));
79
+ }
80
+ export function printSuccessBox(title, ...lines) {
81
+ const content = lines.join('\n');
82
+ console.log(boxen(`${chalk.bold.green(title)}\n\n${content}`, {
83
+ padding: 1,
84
+ borderStyle: 'double',
85
+ borderColor: 'green',
86
+ }));
87
+ }
88
+ export function printWarningBox(title, ...lines) {
89
+ const content = lines.join('\n');
90
+ console.warn(boxen(`${chalk.bold.yellow(title)}\n\n${content}`, {
91
+ padding: 1,
92
+ borderStyle: 'double',
93
+ borderColor: 'yellow',
94
+ }));
95
+ }
96
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/ux/display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns true after delayMs, false until then.
3
+ * Apply as `isDisabled={!isActive}` on any @inkjs/ui interactive component
4
+ * to prevent ghost key events from a previous Ink render from triggering
5
+ * actions immediately after mounting.
6
+ */
7
+ export declare function useActivation(delayMs?: number): boolean;
8
+ //# sourceMappingURL=useActivation.d.ts.map
@@ -0,0 +1,16 @@
1
+ import { useState, useEffect } from 'react';
2
+ /**
3
+ * Returns true after delayMs, false until then.
4
+ * Apply as `isDisabled={!isActive}` on any @inkjs/ui interactive component
5
+ * to prevent ghost key events from a previous Ink render from triggering
6
+ * actions immediately after mounting.
7
+ */
8
+ export function useActivation(delayMs = 120) {
9
+ const [active, setActive] = useState(false);
10
+ useEffect(() => {
11
+ const t = setTimeout(() => setActive(true), delayMs);
12
+ return () => clearTimeout(t);
13
+ }, []);
14
+ return active;
15
+ }
16
+ //# sourceMappingURL=useActivation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useActivation.js","sourceRoot":"","sources":["../../../src/ux/hooks/useActivation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAO,GAAG,GAAG;IACzC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function useSpinner(message: string, active?: boolean): string;
2
+ //# sourceMappingURL=useSpinner.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { useState, useEffect } from 'react';
2
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
3
+ export function useSpinner(message, active = true) {
4
+ const [frame, setFrame] = useState(0);
5
+ useEffect(() => {
6
+ if (!active)
7
+ return;
8
+ const id = setInterval(() => setFrame((f) => (f + 1) % FRAMES.length), 80);
9
+ return () => clearInterval(id);
10
+ }, [active]);
11
+ return `${FRAMES[frame]} ${message}`;
12
+ }
13
+ //# sourceMappingURL=useSpinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSpinner.js","sourceRoot":"","sources":["../../../src/ux/hooks/useSpinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAElE,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,MAAM,GAAG,IAAI;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface MenuItem {
2
+ key: string;
3
+ label: string;
4
+ action: () => Promise<void>;
5
+ }
6
+ export declare function showMenu(title: string, items: MenuItem[]): Promise<void>;
7
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1,56 @@
1
+ import { isCI } from './renderer.js';
2
+ export async function showMenu(title, items) {
3
+ if (isCI()) {
4
+ return plainShowMenu(title, items);
5
+ }
6
+ return inkShowMenu(title, items);
7
+ }
8
+ async function inkShowMenu(title, items) {
9
+ const React = (await import('react')).default;
10
+ const { useState, useEffect } = await import('react');
11
+ const { Box, Text } = await import('ink');
12
+ const { Select } = await import('@inkjs/ui');
13
+ const { renderInteractive } = await import('./renderer.js');
14
+ const { theme } = await import('./theme.js');
15
+ const options = items.map((i) => ({ label: i.label, value: i.key }));
16
+ const selectedKey = await renderInteractive((resolve) => {
17
+ function MenuUI() {
18
+ const [active, setActive] = useState(false);
19
+ useEffect(() => {
20
+ const t = setTimeout(() => setActive(true), 120);
21
+ return () => clearTimeout(t);
22
+ }, []);
23
+ return React.createElement(Box, { flexDirection: 'column', paddingX: 1 }, React.createElement(Text, { bold: true, color: 'white' }, title), React.createElement(Text), React.createElement(Select, { isDisabled: !active, options, onChange: resolve }), React.createElement(Text, { color: theme.muted }, ' ↑↓ navegar Enter seleccionar'));
24
+ }
25
+ return React.createElement(MenuUI, null);
26
+ });
27
+ const selected = items.find((i) => i.key === selectedKey);
28
+ if (selected)
29
+ await selected.action();
30
+ }
31
+ async function plainShowMenu(title, items) {
32
+ const chalk = (await import('chalk')).default;
33
+ const { createInterface } = await import('readline');
34
+ console.log(`\n${chalk.bold(title)}\n`);
35
+ for (const item of items) {
36
+ console.log(` ${chalk.cyan(item.key)}. ${item.label}`);
37
+ }
38
+ return new Promise((resolve) => {
39
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
40
+ rl.question('\n' + chalk.gray('Select option: '), (answer) => {
41
+ rl.close();
42
+ const selected = items.find((i) => i.key === answer.trim());
43
+ if (selected) {
44
+ void selected
45
+ .action()
46
+ .then(resolve)
47
+ .catch(() => resolve());
48
+ }
49
+ else {
50
+ console.log(chalk.yellow('Invalid option.'));
51
+ resolve();
52
+ }
53
+ });
54
+ });
55
+ }
56
+ //# sourceMappingURL=menu.js.map