@thanhvn14/csvibe 0.1.0 → 0.1.2

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 (176) hide show
  1. package/.csvibe/state/approaches.json +1 -0
  2. package/README.md +142 -3
  3. package/dist/commands/brainstorm.d.ts +16 -0
  4. package/dist/commands/brainstorm.d.ts.map +1 -0
  5. package/dist/commands/brainstorm.js +186 -0
  6. package/dist/commands/brainstorm.js.map +1 -0
  7. package/dist/commands/doctor.d.ts +9 -0
  8. package/dist/commands/doctor.d.ts.map +1 -0
  9. package/dist/commands/doctor.js +72 -0
  10. package/dist/commands/doctor.js.map +1 -0
  11. package/dist/commands/help.d.ts.map +1 -1
  12. package/dist/commands/help.js +13 -7
  13. package/dist/commands/help.js.map +1 -1
  14. package/dist/commands/index.d.ts +3 -0
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +7 -1
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/commands/init/index.d.ts +7 -0
  19. package/dist/commands/init/index.d.ts.map +1 -0
  20. package/dist/commands/init/index.js +10 -0
  21. package/dist/commands/init/index.js.map +1 -0
  22. package/dist/commands/init/init-command.d.ts +10 -0
  23. package/dist/commands/init/init-command.d.ts.map +1 -0
  24. package/dist/commands/init/init-command.js +75 -0
  25. package/dist/commands/init/init-command.js.map +1 -0
  26. package/dist/commands/init/phases/config-handler.d.ts +10 -0
  27. package/dist/commands/init/phases/config-handler.d.ts.map +1 -0
  28. package/dist/commands/init/phases/config-handler.js +21 -0
  29. package/dist/commands/init/phases/config-handler.js.map +1 -0
  30. package/dist/commands/init/phases/detection-handler.d.ts +10 -0
  31. package/dist/commands/init/phases/detection-handler.d.ts.map +1 -0
  32. package/dist/commands/init/phases/detection-handler.js +80 -0
  33. package/dist/commands/init/phases/detection-handler.js.map +1 -0
  34. package/dist/commands/init/phases/download-handler.d.ts +9 -0
  35. package/dist/commands/init/phases/download-handler.d.ts.map +1 -0
  36. package/dist/commands/init/phases/download-handler.js +16 -0
  37. package/dist/commands/init/phases/download-handler.js.map +1 -0
  38. package/dist/commands/init/phases/prompt-handler.d.ts +10 -0
  39. package/dist/commands/init/phases/prompt-handler.d.ts.map +1 -0
  40. package/dist/commands/init/phases/prompt-handler.js +24 -0
  41. package/dist/commands/init/phases/prompt-handler.js.map +1 -0
  42. package/dist/commands/init/phases/scaffold-handler.d.ts +9 -0
  43. package/dist/commands/init/phases/scaffold-handler.d.ts.map +1 -0
  44. package/dist/commands/init/phases/scaffold-handler.js +18 -0
  45. package/dist/commands/init/phases/scaffold-handler.js.map +1 -0
  46. package/dist/commands/init/phases/validation-handler.d.ts +14 -0
  47. package/dist/commands/init/phases/validation-handler.d.ts.map +1 -0
  48. package/dist/commands/init/phases/validation-handler.js +50 -0
  49. package/dist/commands/init/phases/validation-handler.js.map +1 -0
  50. package/dist/commands/init/phases/vscode-handler.d.ts +9 -0
  51. package/dist/commands/init/phases/vscode-handler.d.ts.map +1 -0
  52. package/dist/commands/init/phases/vscode-handler.js +16 -0
  53. package/dist/commands/init/phases/vscode-handler.js.map +1 -0
  54. package/dist/commands/init/types.d.ts +28 -0
  55. package/dist/commands/init/types.d.ts.map +1 -0
  56. package/dist/commands/init/types.js +6 -0
  57. package/dist/commands/init/types.js.map +1 -0
  58. package/dist/commands/scout.d.ts +30 -0
  59. package/dist/commands/scout.d.ts.map +1 -0
  60. package/dist/commands/scout.js +116 -0
  61. package/dist/commands/scout.js.map +1 -0
  62. package/dist/config/constants.d.ts +3 -3
  63. package/dist/config/constants.js +3 -3
  64. package/dist/config/constants.js.map +1 -1
  65. package/dist/domains/config/generator.d.ts +17 -0
  66. package/dist/domains/config/generator.d.ts.map +1 -0
  67. package/dist/domains/config/generator.js +67 -0
  68. package/dist/domains/config/generator.js.map +1 -0
  69. package/dist/domains/config/index.d.ts +8 -0
  70. package/dist/domains/config/index.d.ts.map +1 -0
  71. package/dist/domains/config/index.js +15 -0
  72. package/dist/domains/config/index.js.map +1 -0
  73. package/dist/domains/config/types.d.ts +39 -0
  74. package/dist/domains/config/types.d.ts.map +1 -0
  75. package/dist/domains/config/types.js +6 -0
  76. package/dist/domains/config/types.js.map +1 -0
  77. package/dist/domains/config/validator.d.ts +17 -0
  78. package/dist/domains/config/validator.d.ts.map +1 -0
  79. package/dist/domains/config/validator.js +54 -0
  80. package/dist/domains/config/validator.js.map +1 -0
  81. package/dist/domains/github/auth-api.d.ts +19 -0
  82. package/dist/domains/github/auth-api.d.ts.map +1 -0
  83. package/dist/domains/github/auth-api.js +196 -0
  84. package/dist/domains/github/auth-api.js.map +1 -0
  85. package/dist/domains/github/github-client.d.ts +323 -0
  86. package/dist/domains/github/github-client.d.ts.map +1 -0
  87. package/dist/domains/github/github-client.js +192 -0
  88. package/dist/domains/github/github-client.js.map +1 -0
  89. package/dist/domains/github/index.d.ts +9 -0
  90. package/dist/domains/github/index.d.ts.map +1 -0
  91. package/dist/domains/github/index.js +23 -0
  92. package/dist/domains/github/index.js.map +1 -0
  93. package/dist/domains/github/keychain.d.ts +19 -0
  94. package/dist/domains/github/keychain.d.ts.map +1 -0
  95. package/dist/domains/github/keychain.js +132 -0
  96. package/dist/domains/github/keychain.js.map +1 -0
  97. package/dist/domains/github/types.d.ts +40 -0
  98. package/dist/domains/github/types.d.ts.map +1 -0
  99. package/dist/domains/github/types.js +6 -0
  100. package/dist/domains/github/types.js.map +1 -0
  101. package/dist/domains/health-checks/auto-healer.d.ts +14 -0
  102. package/dist/domains/health-checks/auto-healer.d.ts.map +1 -0
  103. package/dist/domains/health-checks/auto-healer.js +160 -0
  104. package/dist/domains/health-checks/auto-healer.js.map +1 -0
  105. package/dist/domains/health-checks/check-runner.d.ts +10 -0
  106. package/dist/domains/health-checks/check-runner.d.ts.map +1 -0
  107. package/dist/domains/health-checks/check-runner.js +31 -0
  108. package/dist/domains/health-checks/check-runner.js.map +1 -0
  109. package/dist/domains/health-checks/checkers/auth-checker.d.ts +10 -0
  110. package/dist/domains/health-checks/checkers/auth-checker.d.ts.map +1 -0
  111. package/dist/domains/health-checks/checkers/auth-checker.js +90 -0
  112. package/dist/domains/health-checks/checkers/auth-checker.js.map +1 -0
  113. package/dist/domains/health-checks/checkers/deps-checker.d.ts +10 -0
  114. package/dist/domains/health-checks/checkers/deps-checker.d.ts.map +1 -0
  115. package/dist/domains/health-checks/checkers/deps-checker.js +150 -0
  116. package/dist/domains/health-checks/checkers/deps-checker.js.map +1 -0
  117. package/dist/domains/health-checks/checkers/project-checker.d.ts +10 -0
  118. package/dist/domains/health-checks/checkers/project-checker.d.ts.map +1 -0
  119. package/dist/domains/health-checks/checkers/project-checker.js +124 -0
  120. package/dist/domains/health-checks/checkers/project-checker.js.map +1 -0
  121. package/dist/domains/health-checks/checkers/system-checker.d.ts +10 -0
  122. package/dist/domains/health-checks/checkers/system-checker.d.ts.map +1 -0
  123. package/dist/domains/health-checks/checkers/system-checker.js +135 -0
  124. package/dist/domains/health-checks/checkers/system-checker.js.map +1 -0
  125. package/dist/domains/health-checks/index.d.ts +9 -0
  126. package/dist/domains/health-checks/index.d.ts.map +1 -0
  127. package/dist/domains/health-checks/index.js +21 -0
  128. package/dist/domains/health-checks/index.js.map +1 -0
  129. package/dist/domains/health-checks/report-generator.d.ts +18 -0
  130. package/dist/domains/health-checks/report-generator.d.ts.map +1 -0
  131. package/dist/domains/health-checks/report-generator.js +117 -0
  132. package/dist/domains/health-checks/report-generator.js.map +1 -0
  133. package/dist/domains/health-checks/types.d.ts +35 -0
  134. package/dist/domains/health-checks/types.d.ts.map +1 -0
  135. package/dist/domains/health-checks/types.js +6 -0
  136. package/dist/domains/health-checks/types.js.map +1 -0
  137. package/dist/index.js +33 -0
  138. package/dist/index.js.map +1 -1
  139. package/dist/utils/approaches-validator.d.ts +40 -0
  140. package/dist/utils/approaches-validator.d.ts.map +1 -0
  141. package/dist/utils/approaches-validator.js +101 -0
  142. package/dist/utils/approaches-validator.js.map +1 -0
  143. package/dist/utils/dependency-analyzer.d.ts +31 -0
  144. package/dist/utils/dependency-analyzer.d.ts.map +1 -0
  145. package/dist/utils/dependency-analyzer.js +294 -0
  146. package/dist/utils/dependency-analyzer.js.map +1 -0
  147. package/dist/utils/directory-analyzer.d.ts +23 -0
  148. package/dist/utils/directory-analyzer.d.ts.map +1 -0
  149. package/dist/utils/directory-analyzer.js +81 -0
  150. package/dist/utils/directory-analyzer.js.map +1 -0
  151. package/dist/utils/downloader.d.ts +3 -3
  152. package/dist/utils/downloader.d.ts.map +1 -1
  153. package/dist/utils/downloader.js +35 -65
  154. package/dist/utils/downloader.js.map +1 -1
  155. package/dist/utils/errors.d.ts +64 -10
  156. package/dist/utils/errors.d.ts.map +1 -1
  157. package/dist/utils/errors.js +136 -22
  158. package/dist/utils/errors.js.map +1 -1
  159. package/dist/utils/gh-cli.d.ts +4 -2
  160. package/dist/utils/gh-cli.d.ts.map +1 -1
  161. package/dist/utils/gh-cli.js +33 -38
  162. package/dist/utils/gh-cli.js.map +1 -1
  163. package/dist/utils/progress.d.ts +37 -0
  164. package/dist/utils/progress.d.ts.map +1 -0
  165. package/dist/utils/progress.js +121 -0
  166. package/dist/utils/progress.js.map +1 -0
  167. package/dist/utils/prompts.d.ts +5 -1
  168. package/dist/utils/prompts.d.ts.map +1 -1
  169. package/dist/utils/prompts.js +124 -64
  170. package/dist/utils/prompts.js.map +1 -1
  171. package/package.json +7 -3
  172. package/test-jira-prompt.js +32 -0
  173. package/dist/commands/init.d.ts +0 -6
  174. package/dist/commands/init.d.ts.map +0 -1
  175. package/dist/commands/init.js +0 -147
  176. package/dist/commands/init.js.map +0 -1
@@ -1,100 +1,160 @@
1
1
  "use strict";
2
2
  /**
3
- * Interactive prompt utilities
3
+ * Interactive prompt utilities using @clack/prompts
4
4
  */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
5
38
  var __importDefault = (this && this.__importDefault) || function (mod) {
6
39
  return (mod && mod.__esModule) ? mod : { "default": mod };
7
40
  };
8
41
  Object.defineProperty(exports, "__esModule", { value: true });
9
42
  exports.promptJiraCredentials = promptJiraCredentials;
10
43
  exports.confirmOverwrite = confirmOverwrite;
44
+ exports.confirmJiraSetup = confirmJiraSetup;
11
45
  exports.showApiTokenInstructions = showApiTokenInstructions;
12
- const inquirer_1 = __importDefault(require("inquirer"));
46
+ const p = __importStar(require("@clack/prompts"));
13
47
  const chalk_1 = __importDefault(require("chalk"));
14
48
  /**
15
49
  * Prompt user for Jira credentials
16
50
  */
17
51
  async function promptJiraCredentials() {
18
- console.log(chalk_1.default.bold('\nJira Configuration'));
19
- console.log(chalk_1.default.gray('Enter your Jira credentials for vibecoding integration.\n'));
20
- const answers = await inquirer_1.default.prompt([
21
- {
22
- type: 'input',
23
- name: 'url',
24
- message: 'Jira URL:',
25
- default: 'https://company.atlassian.net',
26
- validate: (input) => {
27
- if (!input.startsWith('http')) {
28
- return 'URL must start with http:// or https://';
29
- }
30
- return true;
52
+ p.intro(chalk_1.default.bold.cyan('Jira Configuration'));
53
+ const url = await p.text({
54
+ message: 'Jira URL',
55
+ placeholder: 'https://company.atlassian.net',
56
+ validate: (value) => {
57
+ if (!value)
58
+ return 'URL is required';
59
+ if (!value.startsWith('http')) {
60
+ return 'URL must start with http:// or https://';
61
+ }
62
+ },
63
+ });
64
+ if (p.isCancel(url)) {
65
+ p.cancel('Operation cancelled');
66
+ process.exit(0);
67
+ }
68
+ const email = await p.text({
69
+ message: 'Jira Email',
70
+ placeholder: 'your.email@company.com',
71
+ validate: (value) => {
72
+ if (!value)
73
+ return 'Email is required';
74
+ if (!value.includes('@')) {
75
+ return 'Please enter a valid email address';
31
76
  }
32
77
  },
33
- {
34
- type: 'input',
35
- name: 'email',
36
- message: 'Jira Email:',
37
- validate: (input) => {
38
- if (!input.includes('@')) {
39
- return 'Please enter a valid email address';
40
- }
41
- return true;
78
+ });
79
+ if (p.isCancel(email)) {
80
+ p.cancel('Operation cancelled');
81
+ process.exit(0);
82
+ }
83
+ const apiToken = await p.password({
84
+ message: 'Jira API Token',
85
+ validate: (value) => {
86
+ if (!value)
87
+ return 'API token is required';
88
+ if (value.length < 10) {
89
+ return 'API token seems too short. Please enter a valid token.';
42
90
  }
43
91
  },
44
- {
45
- type: 'password',
46
- name: 'apiToken',
47
- message: 'Jira API Token:',
48
- mask: '*',
49
- validate: (input) => {
50
- if (input.length < 10) {
51
- return 'API token seems too short. Please enter a valid token.';
52
- }
53
- return true;
92
+ });
93
+ if (p.isCancel(apiToken)) {
94
+ p.cancel('Operation cancelled');
95
+ process.exit(0);
96
+ }
97
+ const projectKey = await p.text({
98
+ message: 'Jira Project Key',
99
+ placeholder: 'PROJ',
100
+ validate: (value) => {
101
+ if (!value)
102
+ return 'Project key is required';
103
+ if (!/^[A-Z]+$/i.test(value)) {
104
+ return 'Project key must be letters only (e.g., PROJ, QS)';
54
105
  }
55
106
  },
56
- {
57
- type: 'input',
58
- name: 'projectKey',
59
- message: 'Jira Project Key (e.g., PROJ, QS):',
60
- validate: (input) => {
61
- if (!/^[A-Z]+$/.test(input.toUpperCase())) {
62
- return 'Project key must be uppercase letters only (e.g., PROJ, QS)';
63
- }
64
- return true;
65
- },
66
- transformer: (input) => input.toUpperCase()
67
- }
68
- ]);
107
+ });
108
+ if (p.isCancel(projectKey)) {
109
+ p.cancel('Operation cancelled');
110
+ process.exit(0);
111
+ }
112
+ p.outro(chalk_1.default.green('āœ“ Jira credentials configured'));
69
113
  return {
70
- url: answers.url,
71
- email: answers.email,
72
- apiToken: answers.apiToken,
73
- projectKey: answers.projectKey.toUpperCase()
114
+ url: url,
115
+ email: email,
116
+ apiToken: apiToken,
117
+ projectKey: projectKey.toUpperCase(),
74
118
  };
75
119
  }
76
120
  /**
77
121
  * Confirm overwrite of existing setup
78
122
  */
79
123
  async function confirmOverwrite() {
80
- const { confirm } = await inquirer_1.default.prompt([
81
- {
82
- type: 'confirm',
83
- name: 'confirm',
84
- message: chalk_1.default.yellow('CSVibe is already initialized. Overwrite existing setup?'),
85
- default: false
86
- }
87
- ]);
124
+ const confirm = await p.confirm({
125
+ message: 'CSVibe is already initialized. Overwrite existing setup?',
126
+ initialValue: false,
127
+ });
128
+ if (p.isCancel(confirm)) {
129
+ p.cancel('Operation cancelled');
130
+ process.exit(0);
131
+ }
132
+ return confirm;
133
+ }
134
+ /**
135
+ * Confirm Jira setup (optional configuration)
136
+ */
137
+ async function confirmJiraSetup() {
138
+ const confirm = await p.confirm({
139
+ message: 'Configure Jira integration now?',
140
+ initialValue: false,
141
+ });
142
+ if (p.isCancel(confirm)) {
143
+ p.cancel('Operation cancelled');
144
+ process.exit(0);
145
+ }
88
146
  return confirm;
89
147
  }
90
148
  /**
91
149
  * Show API token creation instructions
92
150
  */
93
151
  function showApiTokenInstructions() {
94
- console.log(chalk_1.default.bold('\nšŸ“ How to create a Jira API Token:'));
95
- console.log(' 1. Go to: ' + chalk_1.default.cyan('https://id.atlassian.com/manage-profile/security/api-tokens'));
96
- console.log(' 2. Click "Create API token"');
97
- console.log(' 3. Give it a name (e.g., "CSVibe CLI")');
98
- console.log(' 4. Copy the token and paste it below\n');
152
+ p.note(chalk_1.default.gray('1. Go to: ' +
153
+ chalk_1.default.cyan('https://id.atlassian.com/manage-profile/security/api-tokens') +
154
+ '\n' +
155
+ '2. Click "Create API token"\n' +
156
+ '3. Give it a name (e.g., "CSVibe CLI")\n' +
157
+ '4. Copy the token and paste it below'), chalk_1.default.bold('šŸ“ How to create a Jira API Token'));
158
+ console.log(); // spacing
99
159
  }
100
160
  //# sourceMappingURL=prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thanhvn14/csvibe",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "CSVibe CLI - GitHub Copilot Vibecoding Workflow",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -27,17 +27,21 @@
27
27
  "node": ">=16.0.0"
28
28
  },
29
29
  "dependencies": {
30
+ "@clack/prompts": "^0.7.0",
31
+ "@octokit/rest": "^22.0.1",
30
32
  "chalk": "^5.0.0",
33
+ "cli-progress": "^3.12.0",
31
34
  "commander": "^11.0.0",
32
35
  "execa": "^8.0.0",
33
36
  "fs-extra": "^11.3.3",
34
- "inquirer": "^9.3.8",
37
+ "keytar": "^7.9.0",
35
38
  "ora": "^6.0.0",
39
+ "p-retry": "^6.2.1",
36
40
  "yaml": "^2.8.2"
37
41
  },
38
42
  "devDependencies": {
43
+ "@types/cli-progress": "^3.11.6",
39
44
  "@types/fs-extra": "^11.0.4",
40
- "@types/inquirer": "^9.0.9",
41
45
  "@types/node": "^20.0.0",
42
46
  "@vitest/coverage-v8": "^1.0.0",
43
47
  "tsx": "^4.0.0",
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Debug test for csvibe init - Jira prompt
5
+ */
6
+
7
+ console.log('Testing Jira prompt flow...\n');
8
+
9
+ // Load the actual compiled functions
10
+ const promptHandler = require('./dist/commands/init/phases/prompt-handler.js');
11
+ const prompts = require('./dist/utils/prompts.js');
12
+
13
+ console.log('āœ“ Loaded prompt-handler');
14
+ console.log('āœ“ Loaded prompts utils');
15
+ console.log('\nFunctions available:');
16
+ console.log(' - confirmJiraSetup:', typeof prompts.confirmJiraSetup);
17
+ console.log(' - promptConfiguration:', typeof promptHandler.promptConfiguration);
18
+
19
+ console.log('\n--- Starting promptConfiguration() ---\n');
20
+
21
+ // Call the actual function
22
+ promptHandler.promptConfiguration()
23
+ .then(result => {
24
+ console.log('\n--- Result ---');
25
+ console.log('Returned:', result);
26
+ process.exit(0);
27
+ })
28
+ .catch(err => {
29
+ console.error('\n--- Error ---');
30
+ console.error(err);
31
+ process.exit(1);
32
+ });
@@ -1,6 +0,0 @@
1
- /**
2
- * Init command implementation
3
- * Bootstraps CSVibe project with agents, config, and project scaffolding
4
- */
5
- export declare function initCommand(): Promise<void>;
6
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAwFjD"}
@@ -1,147 +0,0 @@
1
- "use strict";
2
- /**
3
- * Init command implementation
4
- * Bootstraps CSVibe project with agents, config, and project scaffolding
5
- */
6
- var __importDefault = (this && this.__importDefault) || function (mod) {
7
- return (mod && mod.__esModule) ? mod : { "default": mod };
8
- };
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.initCommand = initCommand;
11
- const chalk_1 = __importDefault(require("chalk"));
12
- const path_1 = __importDefault(require("path"));
13
- const fs_extra_1 = __importDefault(require("fs-extra"));
14
- const constants_1 = require("../config/constants");
15
- const logger_1 = require("../utils/logger");
16
- const gh_cli_1 = require("../utils/gh-cli");
17
- const project_detector_1 = require("../utils/project-detector");
18
- const prompts_1 = require("../utils/prompts");
19
- const config_generator_1 = require("../utils/config-generator");
20
- const scaffolder_1 = require("../utils/scaffolder");
21
- const downloader_1 = require("../utils/downloader");
22
- const vscode_validator_1 = require("../utils/vscode-validator");
23
- async function initCommand() {
24
- console.log(chalk_1.default.bold.cyan('\nšŸš€ Initializing CSVibe Project\n'));
25
- const projectRoot = process.cwd();
26
- try {
27
- // Step 1: Validate gh CLI and repo access
28
- const spinner1 = logger_1.logger.spinner('Validating GitHub CLI and repository access');
29
- try {
30
- await (0, gh_cli_1.validateGhCli)(constants_1.CONSTANTS.REPO_FULL);
31
- spinner1.succeed('GitHub CLI validated');
32
- }
33
- catch (error) {
34
- spinner1.fail('GitHub CLI validation failed');
35
- throw error;
36
- }
37
- // Step 2: Check if already initialized
38
- if (await (0, config_generator_1.isInitialized)(projectRoot)) {
39
- logger_1.logger.warning('CSVibe is already initialized in this directory');
40
- const shouldOverwrite = await (0, prompts_1.confirmOverwrite)();
41
- if (!shouldOverwrite) {
42
- console.log(chalk_1.default.gray('\nInitialization cancelled.\n'));
43
- return;
44
- }
45
- console.log(); // spacing
46
- }
47
- // Step 3: Detect project type
48
- const spinner2 = logger_1.logger.spinner('Detecting project type');
49
- const projectType = await (0, project_detector_1.detectProjectType)(projectRoot);
50
- spinner2.succeed(`Project type detected: ${chalk_1.default.cyan(projectType)}`);
51
- // Step 4: Get project metadata
52
- const projectName = path_1.default.basename(projectRoot);
53
- const projectVersion = await getProjectVersion(projectRoot);
54
- // Step 5: Prompt for Jira credentials
55
- (0, prompts_1.showApiTokenInstructions)();
56
- const jiraCredentials = await (0, prompts_1.promptJiraCredentials)();
57
- console.log(); // spacing
58
- // Step 6: Scaffold directory structure
59
- const spinner3 = logger_1.logger.spinner('Creating directory structure');
60
- await (0, scaffolder_1.scaffold)(projectRoot);
61
- spinner3.succeed('Directory structure created');
62
- // Step 7: Download assets from csvibe-engine
63
- await (0, downloader_1.downloadGithubAssets)(constants_1.CONSTANTS.REPO_FULL, 'main', projectRoot);
64
- // Step 8: Generate config.yml
65
- const spinner4 = logger_1.logger.spinner('Generating configuration');
66
- const configTemplate = await (0, downloader_1.downloadConfigTemplate)(constants_1.CONSTANTS.REPO_FULL);
67
- await (0, config_generator_1.generateConfig)(configTemplate, {
68
- projectName,
69
- projectType,
70
- projectVersion,
71
- jiraCredentials,
72
- targetDir: projectRoot
73
- });
74
- spinner4.succeed('Configuration generated');
75
- // Step 9: Validate VSCode and Copilot (non-blocking)
76
- console.log(); // spacing
77
- await (0, vscode_validator_1.validateVSCodeSetup)();
78
- // Step 10: Display success message
79
- console.log(chalk_1.default.bold.green('\nāœ“ CSVibe initialized successfully!\n'));
80
- console.log(chalk_1.default.bold('Next steps:'));
81
- console.log(' 1. Review ' + chalk_1.default.cyan('.csvibe/config.yml') + ' and adjust as needed');
82
- console.log(' 2. Review ' + chalk_1.default.cyan('.github/agents/') + ' templates');
83
- console.log(' 3. Start vibecoding with ' + chalk_1.default.cyan('csvibe run'));
84
- console.log();
85
- console.log(chalk_1.default.gray('Configuration saved to: ') + chalk_1.default.cyan(path_1.default.join(projectRoot, constants_1.CONSTANTS.CONFIG_FILE)));
86
- console.log();
87
- }
88
- catch (error) {
89
- if (error instanceof Error) {
90
- logger_1.logger.error(error.message);
91
- }
92
- else {
93
- logger_1.logger.error('An unexpected error occurred during initialization');
94
- }
95
- console.log('\n' + chalk_1.default.gray('For help, visit: ') + chalk_1.default.cyan(constants_1.CONSTANTS.ISSUES_URL) + '\n');
96
- process.exit(1);
97
- }
98
- }
99
- /**
100
- * Get project version from package.json or other manifest files
101
- */
102
- async function getProjectVersion(projectRoot) {
103
- // Try package.json first (Node.js projects)
104
- const packageJsonPath = path_1.default.join(projectRoot, 'package.json');
105
- if (await fs_extra_1.default.pathExists(packageJsonPath)) {
106
- try {
107
- const pkg = await fs_extra_1.default.readJson(packageJsonPath);
108
- if (pkg.version) {
109
- return pkg.version;
110
- }
111
- }
112
- catch {
113
- // Ignore parse errors
114
- }
115
- }
116
- // Try pyproject.toml (Python projects)
117
- const pyprojectPath = path_1.default.join(projectRoot, 'pyproject.toml');
118
- if (await fs_extra_1.default.pathExists(pyprojectPath)) {
119
- try {
120
- const content = await fs_extra_1.default.readFile(pyprojectPath, 'utf-8');
121
- const versionMatch = content.match(/version\s*=\s*["']([^"']+)["']/);
122
- if (versionMatch && versionMatch[1]) {
123
- return versionMatch[1];
124
- }
125
- }
126
- catch {
127
- // Ignore parse errors
128
- }
129
- }
130
- // Try Cargo.toml (Rust projects)
131
- const cargoPath = path_1.default.join(projectRoot, 'Cargo.toml');
132
- if (await fs_extra_1.default.pathExists(cargoPath)) {
133
- try {
134
- const content = await fs_extra_1.default.readFile(cargoPath, 'utf-8');
135
- const versionMatch = content.match(/version\s*=\s*["']([^"']+)["']/);
136
- if (versionMatch && versionMatch[1]) {
137
- return versionMatch[1];
138
- }
139
- }
140
- catch {
141
- // Ignore parse errors
142
- }
143
- }
144
- // Default fallback
145
- return '0.1.0';
146
- }
147
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}