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,261 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ export function detectProjectType(cwd) {
4
+ if (existsSync(join(cwd, 'package.json')))
5
+ return 'node';
6
+ if (existsSync(join(cwd, 'requirements.txt')) ||
7
+ existsSync(join(cwd, 'pyproject.toml')) ||
8
+ existsSync(join(cwd, 'setup.py')))
9
+ return 'python';
10
+ if (existsSync(join(cwd, 'pom.xml')) || existsSync(join(cwd, 'build.gradle')))
11
+ return 'java';
12
+ if (existsSync(join(cwd, 'go.mod')))
13
+ return 'go';
14
+ if (existsSync(join(cwd, 'Cargo.toml')))
15
+ return 'rust';
16
+ return 'generic';
17
+ }
18
+ export const PROJECT_TYPE_LABELS = {
19
+ node: 'Node.js / TypeScript / JavaScript',
20
+ python: 'Python',
21
+ java: 'Java / Kotlin (Maven / Gradle)',
22
+ go: 'Go',
23
+ rust: 'Rust',
24
+ generic: 'Generic (editor files, env, logs)',
25
+ };
26
+ const TEMPLATES = {
27
+ node: `# Dependencies
28
+ node_modules/
29
+ .pnp
30
+ .pnp.js
31
+
32
+ # Build output
33
+ dist/
34
+ build/
35
+ out/
36
+ .next/
37
+ .nuxt/
38
+
39
+ # Environment variables — NEVER commit secrets
40
+ .env
41
+ .env.local
42
+ .env.*.local
43
+ .env.production
44
+
45
+ # Package manager locks (keep only the one you use)
46
+ # yarn.lock
47
+ # pnpm-lock.yaml
48
+
49
+ # Logs
50
+ logs/
51
+ *.log
52
+ npm-debug.log*
53
+ yarn-debug.log*
54
+ pnpm-debug.log*
55
+ lerna-debug.log*
56
+
57
+ # Runtime data
58
+ pids/
59
+ *.pid
60
+ *.seed
61
+ *.pid.lock
62
+
63
+ # Test & coverage
64
+ coverage/
65
+ .nyc_output/
66
+ *.lcov
67
+
68
+ # IDE / Editor
69
+ .vscode/
70
+ .idea/
71
+ *.swp
72
+ *.swo
73
+ .project
74
+ .classpath
75
+
76
+ # OS
77
+ .DS_Store
78
+ Thumbs.db
79
+ Desktop.ini
80
+
81
+ # Temp
82
+ *.tmp
83
+ *.temp
84
+ .cache/
85
+ `,
86
+ python: `# Byte-compiled / optimized / DLL files
87
+ __pycache__/
88
+ *.py[cod]
89
+ *$py.class
90
+ *.pyo
91
+
92
+ # Distribution / packaging
93
+ dist/
94
+ build/
95
+ *.egg-info/
96
+ .eggs/
97
+ *.whl
98
+
99
+ # Virtual environments
100
+ .venv/
101
+ venv/
102
+ env/
103
+ .Python
104
+
105
+ # Environment variables
106
+ .env
107
+ .env.*
108
+
109
+ # Test & coverage
110
+ .coverage
111
+ htmlcov/
112
+ .pytest_cache/
113
+ .tox/
114
+
115
+ # Type checking
116
+ .mypy_cache/
117
+ .pytype/
118
+
119
+ # IDE / Editor
120
+ .vscode/
121
+ .idea/
122
+ *.swp
123
+
124
+ # OS
125
+ .DS_Store
126
+ Thumbs.db
127
+ `,
128
+ java: `# Compiled output
129
+ *.class
130
+ target/
131
+ build/
132
+ out/
133
+
134
+ # Package files
135
+ *.jar
136
+ *.war
137
+ *.ear
138
+
139
+ # Maven wrapper
140
+ .mvn/wrapper/maven-wrapper.jar
141
+ !.mvn/wrapper/maven-wrapper.properties
142
+
143
+ # Gradle
144
+ .gradle/
145
+ gradle-app.setting
146
+ !gradle-wrapper.jar
147
+ .gradletasknamecache
148
+ local.properties
149
+
150
+ # Environment
151
+ .env
152
+ .env.*
153
+
154
+ # IDE / Editor
155
+ .vscode/
156
+ .idea/
157
+ *.iml
158
+ *.iws
159
+ .project
160
+ .classpath
161
+ .settings/
162
+
163
+ # OS
164
+ .DS_Store
165
+ Thumbs.db
166
+ `,
167
+ go: `# Binaries
168
+ *.exe
169
+ *.exe~
170
+ *.dll
171
+ *.so
172
+ *.dylib
173
+
174
+ # Test binary
175
+ *.test
176
+
177
+ # Output
178
+ bin/
179
+ dist/
180
+
181
+ # Vendor (if not using modules)
182
+ vendor/
183
+
184
+ # Environment
185
+ .env
186
+ .env.*
187
+
188
+ # IDE / Editor
189
+ .vscode/
190
+ .idea/
191
+ *.swp
192
+
193
+ # OS
194
+ .DS_Store
195
+ Thumbs.db
196
+ `,
197
+ rust: `# Compiled output
198
+ /target/
199
+ **/*.rs.bk
200
+
201
+ # Cargo lock (keep for binaries; add to .gitignore for libraries)
202
+ # Cargo.lock
203
+
204
+ # Environment
205
+ .env
206
+ .env.*
207
+
208
+ # IDE / Editor
209
+ .vscode/
210
+ .idea/
211
+ *.swp
212
+
213
+ # OS
214
+ .DS_Store
215
+ Thumbs.db
216
+ `,
217
+ generic: `# Environment variables — NEVER commit secrets
218
+ .env
219
+ .env.*
220
+ .env.local
221
+
222
+ # Logs
223
+ *.log
224
+ logs/
225
+
226
+ # Build output
227
+ dist/
228
+ build/
229
+ out/
230
+
231
+ # IDE / Editor
232
+ .vscode/
233
+ .idea/
234
+ *.swp
235
+ *.swo
236
+
237
+ # OS
238
+ .DS_Store
239
+ Thumbs.db
240
+ Desktop.ini
241
+
242
+ # Temp
243
+ *.tmp
244
+ *.temp
245
+ .cache/
246
+ `,
247
+ };
248
+ export function hasGitignore(cwd) {
249
+ return existsSync(join(cwd, '.gitignore'));
250
+ }
251
+ export function readGitignore(cwd) {
252
+ const path = join(cwd, '.gitignore');
253
+ return existsSync(path) ? readFileSync(path, 'utf-8') : '';
254
+ }
255
+ export function writeGitignore(content, cwd) {
256
+ writeFileSync(join(cwd, '.gitignore'), content, 'utf-8');
257
+ }
258
+ export function getTemplate(type) {
259
+ return TEMPLATES[type];
260
+ }
261
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/git/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACzD,IACE,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACzC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACvC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAEjC,OAAO,QAAQ,CAAC;IAClB,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7F,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACvD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAgC;IAC9D,IAAI,EAAE,mCAAmC;IACzC,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,gCAAgC;IACtC,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,mCAAmC;CAC7C,CAAC;AAEF,MAAM,SAAS,GAAgC;IAC7C,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DP;IAEC,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCT;IAEC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCP;IAEC,EAAE,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BL;IAEC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;CAmBP;IAEC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BV;CACA,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,GAAW;IACzD,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runRemoteSetup(cwd?: string): Promise<void>;
2
+ //# sourceMappingURL=remote-setup.d.ts.map
@@ -0,0 +1,129 @@
1
+ import { spawnSync } from 'child_process';
2
+ import { basename } from 'path';
3
+ import { blank, info, section, success, warning } from '../ux/display.js';
4
+ import { confirmPrompt, inputPrompt, selectPrompt } from '../ux/prompt.js';
5
+ function isGhAvailable() {
6
+ return spawnSync('gh', ['--version'], { encoding: 'utf-8' }).status === 0;
7
+ }
8
+ function isGhAuthenticated() {
9
+ return spawnSync('gh', ['auth', 'status'], { encoding: 'utf-8' }).status === 0;
10
+ }
11
+ function gitRemoteAdd(name, url, cwd) {
12
+ return spawnSync('git', ['remote', 'add', name, url], { cwd, encoding: 'utf-8' }).status === 0;
13
+ }
14
+ function getExistingRemotes(cwd) {
15
+ const r = spawnSync('git', ['remote'], { cwd, encoding: 'utf-8' });
16
+ return r.status === 0 ? r.stdout.trim().split('\n').filter(Boolean) : [];
17
+ }
18
+ export async function runRemoteSetup(cwd = process.cwd()) {
19
+ section('Remote Repository');
20
+ const existingRemotes = getExistingRemotes(cwd);
21
+ if (existingRemotes.length > 0) {
22
+ info(`Remote already configured: ${existingRemotes.join(', ')}`);
23
+ const reconfigure = await confirmPrompt('Do you want to add another remote?', false);
24
+ if (!reconfigure)
25
+ return;
26
+ }
27
+ const ghAvailable = isGhAvailable();
28
+ const ghAuth = ghAvailable && isGhAuthenticated();
29
+ const options = [];
30
+ if (ghAvailable && ghAuth) {
31
+ options.push('Create new GitHub repository (gh CLI — authenticated)');
32
+ }
33
+ else if (ghAvailable) {
34
+ options.push('Create new GitHub repository (gh CLI — need to login first)');
35
+ }
36
+ options.push('Enter remote URL manually (GitHub, GitLab, Bitbucket, self-hosted...)');
37
+ options.push('Skip for now — I will add the remote later');
38
+ const choice = await selectPrompt('How do you want to connect to a remote?', options);
39
+ if (choice.startsWith('Skip')) {
40
+ blank();
41
+ info('No remote configured. Add it later with:');
42
+ console.log(' git remote add origin <URL>');
43
+ console.log(' gsf push');
44
+ blank();
45
+ return;
46
+ }
47
+ if (choice.startsWith('Create new GitHub') && ghAvailable) {
48
+ if (!ghAuth) {
49
+ warning('You need to authenticate with GitHub first.');
50
+ info('Run the following command in your terminal, then come back:');
51
+ console.log('\n gh auth login\n');
52
+ const retry = await confirmPrompt('Have you logged in? Try creating the repo now?', false);
53
+ if (!retry)
54
+ return;
55
+ }
56
+ await createGitHubRepo(cwd);
57
+ return;
58
+ }
59
+ // Manual URL
60
+ await enterRemoteManually(cwd);
61
+ }
62
+ async function createGitHubRepo(cwd) {
63
+ const dirName = basename(cwd);
64
+ const repoName = await inputPrompt('Repository name', dirName);
65
+ if (!repoName.trim()) {
66
+ info('Cancelled.');
67
+ return;
68
+ }
69
+ const visibility = await selectPrompt('Visibility:', ['private', 'public']);
70
+ const description = await inputPrompt('Description (optional, press Enter to skip)', '');
71
+ blank();
72
+ info(`Creating "${repoName}" on GitHub...`);
73
+ const args = [
74
+ 'repo',
75
+ 'create',
76
+ repoName.trim(),
77
+ `--${visibility}`,
78
+ '--source=.',
79
+ '--remote=origin',
80
+ '--push=false',
81
+ ];
82
+ if (description.trim())
83
+ args.push('--description', description.trim());
84
+ const result = spawnSync('gh', args, { cwd, encoding: 'utf-8' });
85
+ if (result.status === 0) {
86
+ const url = result.stdout.trim() || `https://github.com/<user>/${repoName.trim()}`;
87
+ success(`Repository "${repoName.trim()}" created and "origin" remote configured.`);
88
+ info(`Remote URL: ${url}`);
89
+ blank();
90
+ info('Your first push:');
91
+ console.log(' gsf push');
92
+ }
93
+ else {
94
+ warning('Could not create repository automatically.');
95
+ if (result.stderr)
96
+ console.log('\n' + result.stderr.trim());
97
+ blank();
98
+ info('Create it manually at https://github.com/new, then run:');
99
+ console.log(' git remote add origin <URL>');
100
+ console.log(' gsf push');
101
+ }
102
+ }
103
+ async function enterRemoteManually(cwd) {
104
+ blank();
105
+ info('Steps to get your remote URL:');
106
+ console.log(' GitHub → https://github.com/new');
107
+ console.log(' GitLab → https://gitlab.com/projects/new');
108
+ console.log(' Create the repository there (empty, no README), then copy the clone URL.');
109
+ blank();
110
+ const url = await inputPrompt('Remote URL (SSH or HTTPS)');
111
+ if (!url.trim()) {
112
+ info('Skipped — no URL provided.');
113
+ return;
114
+ }
115
+ const remoteName = await inputPrompt('Remote name', 'origin');
116
+ const name = remoteName.trim() || 'origin';
117
+ const ok = gitRemoteAdd(name, url.trim(), cwd);
118
+ if (ok) {
119
+ success(`Remote "${name}" set to: ${url.trim()}`);
120
+ blank();
121
+ info('Your first push:');
122
+ console.log(' gsf push');
123
+ }
124
+ else {
125
+ warning(`Could not add remote "${name}". It may already exist.`);
126
+ info('Check existing remotes with: git remote -v');
127
+ }
128
+ }
129
+ //# sourceMappingURL=remote-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-setup.js","sourceRoot":"","sources":["../../src/git/remote-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE3E,SAAS,aAAa;IACpB,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,GAAW,EAAE,GAAW;IAC1D,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACtD,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE7B,MAAM,eAAe,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,8BAA8B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QACrF,IAAI,CAAC,WAAW;YAAE,OAAO;IAC3B,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,WAAW,IAAI,iBAAiB,EAAE,CAAC;IAElD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACxE,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,yCAAyC,EAAE,OAAO,CAAC,CAAC;IAEtF,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,KAAK,EAAE,CAAC;QACR,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,WAAW,EAAE,CAAC;QAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,6CAA6C,CAAC,CAAC;YACvD,IAAI,CAAC,6DAA6D,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;YAC3F,IAAI,CAAC,KAAK;gBAAE,OAAO;QACrB,CAAC;QACD,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,aAAa;IACb,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,6CAA6C,EAAE,EAAE,CAAC,CAAC;IAEzF,KAAK,EAAE,CAAC;IACR,IAAI,CAAC,aAAa,QAAQ,gBAAgB,CAAC,CAAC;IAE5C,MAAM,IAAI,GAAG;QACX,MAAM;QACN,QAAQ;QACR,QAAQ,CAAC,IAAI,EAAE;QACf,KAAK,UAAU,EAAE;QACjB,YAAY;QACZ,iBAAiB;QACjB,cAAc;KACf,CAAC;IACF,IAAI,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,6BAA6B,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACnF,OAAO,CAAC,eAAe,QAAQ,CAAC,IAAI,EAAE,2CAA2C,CAAC,CAAC;QACnF,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;QAC3B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,4CAA4C,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,yDAAyD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,GAAW;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;IAC1F,KAAK,EAAE,CAAC;IAER,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC;IAE3C,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/C,IAAI,EAAE,EAAE,CAAC;QACP,OAAO,CAAC,WAAW,IAAI,aAAa,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,yBAAyB,IAAI,0BAA0B,CAAC,CAAC;QACjE,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { CommitConvention, RepoContext, StagedFile } from '../types/index.js';
2
+ export declare function isGitRepo(cwd?: string): boolean;
3
+ export declare function initRepo(cwd?: string): void;
4
+ export declare function hasCommits(cwd?: string): boolean;
5
+ export declare function unstageAll(cwd?: string): void;
6
+ export declare function setDefaultBranch(name: string, cwd?: string): void;
7
+ export declare function getGitUserConfig(cwd?: string): {
8
+ name: string;
9
+ email: string;
10
+ };
11
+ export declare function setGitUserConfig(name: string, email: string, cwd?: string): void;
12
+ export interface BranchInfo {
13
+ name: string;
14
+ current: boolean;
15
+ remote: boolean;
16
+ merged: boolean;
17
+ }
18
+ export declare function listBranches(includeRemote?: boolean, cwd?: string): BranchInfo[];
19
+ export declare function createBranch(name: string, baseBranch?: string, cwd?: string): void;
20
+ export declare function switchBranch(name: string, cwd?: string): void;
21
+ export declare function deleteBranch(name: string, force?: boolean, cwd?: string): void;
22
+ export declare function deleteRemoteBranch(remote: string, name: string, cwd?: string): void;
23
+ export declare function renameBranch(newName: string, cwd?: string): void;
24
+ export declare function branchExists(name: string, cwd?: string): boolean;
25
+ export declare function getRepoName(cwd?: string): string;
26
+ export declare function getCurrentBranch(cwd?: string): string;
27
+ export declare function isProtectedBranch(branch: string, protectedBranches: string[]): boolean;
28
+ export declare function extractTicketFromBranch(branch: string, ticketPattern: string): string | undefined;
29
+ export declare function getStagedFiles(cwd?: string): StagedFile[];
30
+ export declare function getUnstagedFiles(cwd?: string): string[];
31
+ export declare function getUntrackedFiles(cwd?: string): string[];
32
+ export declare function getStagedDiff(cwd?: string): string;
33
+ export interface LastCommit {
34
+ shortSha: string;
35
+ message: string;
36
+ author: string;
37
+ ago: string;
38
+ }
39
+ export declare function getLastCommit(cwd?: string): LastCommit | null;
40
+ export declare function fetchRemote(cwd?: string): {
41
+ ok: boolean;
42
+ output: string;
43
+ };
44
+ export declare function getLastFetchTime(cwd?: string): Date | null;
45
+ export declare function getCommitsSinceBase(base: string, cwd?: string): string[];
46
+ export declare function getUpstream(cwd?: string): string | undefined;
47
+ export declare function getAheadBehindCount(upstream: string, cwd?: string): {
48
+ ahead: number;
49
+ behind: number;
50
+ };
51
+ export declare function hasMergeConflicts(cwd?: string): boolean;
52
+ export declare function hasUncommittedChanges(cwd?: string): boolean;
53
+ export declare function stageFile(filePath: string, cwd?: string): void;
54
+ export declare function stageFiles(paths: string[], cwd?: string): void;
55
+ export declare function buildRepoContext(protectedBranches: string[], ticketPattern: string, convention: CommitConvention, cwd?: string): RepoContext;
56
+ export declare function refExists(ref: string, cwd?: string): boolean;
57
+ export declare function stashSave(message: string, cwd?: string): void;
58
+ export declare function stashPop(cwd?: string): void;
59
+ export interface StashEntry {
60
+ index: number;
61
+ ref: string;
62
+ message: string;
63
+ ago: string;
64
+ }
65
+ export declare function stashList(cwd?: string): StashEntry[];
66
+ export declare function stashApplyRef(ref: string, cwd?: string): void;
67
+ export declare function stashPopRef(ref: string, cwd?: string): void;
68
+ export declare function stashDropRef(ref: string, cwd?: string): void;
69
+ export declare function resetHard(ref: string, cwd?: string): void;
70
+ export declare function detectGhCli(): boolean;
71
+ export declare function autoFetchIfStale(thresholdMinutes: number, cwd?: string): void;
72
+ export declare function listRemotes(cwd?: string): string[];
73
+ //# sourceMappingURL=repo.d.ts.map