@thanhvn14/csvibe 0.1.1 → 0.1.3

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 (180) 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 +2 -1
  63. package/dist/config/constants.d.ts.map +1 -1
  64. package/dist/config/constants.js +2 -1
  65. package/dist/config/constants.js.map +1 -1
  66. package/dist/domains/config/generator.d.ts +17 -0
  67. package/dist/domains/config/generator.d.ts.map +1 -0
  68. package/dist/domains/config/generator.js +67 -0
  69. package/dist/domains/config/generator.js.map +1 -0
  70. package/dist/domains/config/index.d.ts +8 -0
  71. package/dist/domains/config/index.d.ts.map +1 -0
  72. package/dist/domains/config/index.js +15 -0
  73. package/dist/domains/config/index.js.map +1 -0
  74. package/dist/domains/config/types.d.ts +39 -0
  75. package/dist/domains/config/types.d.ts.map +1 -0
  76. package/dist/domains/config/types.js +6 -0
  77. package/dist/domains/config/types.js.map +1 -0
  78. package/dist/domains/config/validator.d.ts +17 -0
  79. package/dist/domains/config/validator.d.ts.map +1 -0
  80. package/dist/domains/config/validator.js +54 -0
  81. package/dist/domains/config/validator.js.map +1 -0
  82. package/dist/domains/github/auth-api.d.ts +19 -0
  83. package/dist/domains/github/auth-api.d.ts.map +1 -0
  84. package/dist/domains/github/auth-api.js +196 -0
  85. package/dist/domains/github/auth-api.js.map +1 -0
  86. package/dist/domains/github/github-client.d.ts +323 -0
  87. package/dist/domains/github/github-client.d.ts.map +1 -0
  88. package/dist/domains/github/github-client.js +192 -0
  89. package/dist/domains/github/github-client.js.map +1 -0
  90. package/dist/domains/github/index.d.ts +9 -0
  91. package/dist/domains/github/index.d.ts.map +1 -0
  92. package/dist/domains/github/index.js +23 -0
  93. package/dist/domains/github/index.js.map +1 -0
  94. package/dist/domains/github/keychain.d.ts +19 -0
  95. package/dist/domains/github/keychain.d.ts.map +1 -0
  96. package/dist/domains/github/keychain.js +132 -0
  97. package/dist/domains/github/keychain.js.map +1 -0
  98. package/dist/domains/github/types.d.ts +40 -0
  99. package/dist/domains/github/types.d.ts.map +1 -0
  100. package/dist/domains/github/types.js +6 -0
  101. package/dist/domains/github/types.js.map +1 -0
  102. package/dist/domains/health-checks/auto-healer.d.ts +14 -0
  103. package/dist/domains/health-checks/auto-healer.d.ts.map +1 -0
  104. package/dist/domains/health-checks/auto-healer.js +160 -0
  105. package/dist/domains/health-checks/auto-healer.js.map +1 -0
  106. package/dist/domains/health-checks/check-runner.d.ts +10 -0
  107. package/dist/domains/health-checks/check-runner.d.ts.map +1 -0
  108. package/dist/domains/health-checks/check-runner.js +31 -0
  109. package/dist/domains/health-checks/check-runner.js.map +1 -0
  110. package/dist/domains/health-checks/checkers/auth-checker.d.ts +10 -0
  111. package/dist/domains/health-checks/checkers/auth-checker.d.ts.map +1 -0
  112. package/dist/domains/health-checks/checkers/auth-checker.js +90 -0
  113. package/dist/domains/health-checks/checkers/auth-checker.js.map +1 -0
  114. package/dist/domains/health-checks/checkers/deps-checker.d.ts +10 -0
  115. package/dist/domains/health-checks/checkers/deps-checker.d.ts.map +1 -0
  116. package/dist/domains/health-checks/checkers/deps-checker.js +150 -0
  117. package/dist/domains/health-checks/checkers/deps-checker.js.map +1 -0
  118. package/dist/domains/health-checks/checkers/project-checker.d.ts +10 -0
  119. package/dist/domains/health-checks/checkers/project-checker.d.ts.map +1 -0
  120. package/dist/domains/health-checks/checkers/project-checker.js +124 -0
  121. package/dist/domains/health-checks/checkers/project-checker.js.map +1 -0
  122. package/dist/domains/health-checks/checkers/system-checker.d.ts +10 -0
  123. package/dist/domains/health-checks/checkers/system-checker.d.ts.map +1 -0
  124. package/dist/domains/health-checks/checkers/system-checker.js +135 -0
  125. package/dist/domains/health-checks/checkers/system-checker.js.map +1 -0
  126. package/dist/domains/health-checks/index.d.ts +9 -0
  127. package/dist/domains/health-checks/index.d.ts.map +1 -0
  128. package/dist/domains/health-checks/index.js +21 -0
  129. package/dist/domains/health-checks/index.js.map +1 -0
  130. package/dist/domains/health-checks/report-generator.d.ts +18 -0
  131. package/dist/domains/health-checks/report-generator.d.ts.map +1 -0
  132. package/dist/domains/health-checks/report-generator.js +117 -0
  133. package/dist/domains/health-checks/report-generator.js.map +1 -0
  134. package/dist/domains/health-checks/types.d.ts +35 -0
  135. package/dist/domains/health-checks/types.d.ts.map +1 -0
  136. package/dist/domains/health-checks/types.js +6 -0
  137. package/dist/domains/health-checks/types.js.map +1 -0
  138. package/dist/index.js +33 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/utils/approaches-validator.d.ts +40 -0
  141. package/dist/utils/approaches-validator.d.ts.map +1 -0
  142. package/dist/utils/approaches-validator.js +101 -0
  143. package/dist/utils/approaches-validator.js.map +1 -0
  144. package/dist/utils/dependency-analyzer.d.ts +31 -0
  145. package/dist/utils/dependency-analyzer.d.ts.map +1 -0
  146. package/dist/utils/dependency-analyzer.js +294 -0
  147. package/dist/utils/dependency-analyzer.js.map +1 -0
  148. package/dist/utils/directory-analyzer.d.ts +23 -0
  149. package/dist/utils/directory-analyzer.d.ts.map +1 -0
  150. package/dist/utils/directory-analyzer.js +81 -0
  151. package/dist/utils/directory-analyzer.js.map +1 -0
  152. package/dist/utils/downloader.d.ts +3 -3
  153. package/dist/utils/downloader.d.ts.map +1 -1
  154. package/dist/utils/downloader.js +35 -65
  155. package/dist/utils/downloader.js.map +1 -1
  156. package/dist/utils/errors.d.ts +64 -10
  157. package/dist/utils/errors.d.ts.map +1 -1
  158. package/dist/utils/errors.js +136 -22
  159. package/dist/utils/errors.js.map +1 -1
  160. package/dist/utils/gh-cli.d.ts +4 -2
  161. package/dist/utils/gh-cli.d.ts.map +1 -1
  162. package/dist/utils/gh-cli.js +33 -38
  163. package/dist/utils/gh-cli.js.map +1 -1
  164. package/dist/utils/progress.d.ts +37 -0
  165. package/dist/utils/progress.d.ts.map +1 -0
  166. package/dist/utils/progress.js +121 -0
  167. package/dist/utils/progress.js.map +1 -0
  168. package/dist/utils/prompts.d.ts +5 -1
  169. package/dist/utils/prompts.d.ts.map +1 -1
  170. package/dist/utils/prompts.js +124 -64
  171. package/dist/utils/prompts.js.map +1 -1
  172. package/dist/utils/scaffolder.d.ts.map +1 -1
  173. package/dist/utils/scaffolder.js +1 -3
  174. package/dist/utils/scaffolder.js.map +1 -1
  175. package/package.json +7 -3
  176. package/test-jira-prompt.js +32 -0
  177. package/dist/commands/init.d.ts +0 -6
  178. package/dist/commands/init.d.ts.map +0 -1
  179. package/dist/commands/init.js +0 -147
  180. package/dist/commands/init.js.map +0 -1
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * Directory structure analysis
4
+ * Analyzes project directory structure to identify source, test, and config directories
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.analyzeDirectories = analyzeDirectories;
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const project_detector_1 = require("./project-detector");
14
+ /**
15
+ * Analyze project directory structure
16
+ * Uses predefined candidate lists to identify common directory patterns
17
+ *
18
+ * @param projectRoot - Root directory of the project
19
+ * @param projectType - Detected project type
20
+ * @returns Directory structure with source, test, and config directories
21
+ */
22
+ async function analyzeDirectories(projectRoot, projectType) {
23
+ const result = {
24
+ source: [],
25
+ tests: [],
26
+ config: ['.'] // Root always has config files
27
+ };
28
+ try {
29
+ const entries = await fs_extra_1.default.readdir(projectRoot, { withFileTypes: true });
30
+ const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
31
+ // Source directories - common patterns across ecosystems
32
+ const sourceCandidates = ['src', 'lib', 'app', 'components', 'packages', 'apps'];
33
+ for (const candidate of sourceCandidates) {
34
+ if (dirs.includes(candidate)) {
35
+ result.source.push(candidate);
36
+ }
37
+ }
38
+ // Test directories - common test directory names
39
+ const testCandidates = ['test', 'tests', '__tests__', 'spec', '__test__'];
40
+ for (const candidate of testCandidates) {
41
+ if (dirs.includes(candidate)) {
42
+ result.tests.push(candidate);
43
+ }
44
+ }
45
+ // Additional config directories for monorepos
46
+ if (projectType === project_detector_1.ProjectType.NodeMonorepo) {
47
+ // Scan packages/ for individual package configs
48
+ if (dirs.includes('packages')) {
49
+ const packagesDir = path_1.default.join(projectRoot, 'packages');
50
+ try {
51
+ const packageDirs = await fs_extra_1.default.readdir(packagesDir, { withFileTypes: true });
52
+ packageDirs
53
+ .filter(e => e.isDirectory())
54
+ .forEach(e => result.config.push(`packages/${e.name}`));
55
+ }
56
+ catch {
57
+ // Ignore if packages/ is not accessible
58
+ }
59
+ }
60
+ // Scan apps/ for individual app configs
61
+ if (dirs.includes('apps')) {
62
+ const appsDir = path_1.default.join(projectRoot, 'apps');
63
+ try {
64
+ const appDirs = await fs_extra_1.default.readdir(appsDir, { withFileTypes: true });
65
+ appDirs
66
+ .filter(e => e.isDirectory())
67
+ .forEach(e => result.config.push(`apps/${e.name}`));
68
+ }
69
+ catch {
70
+ // Ignore if apps/ is not accessible
71
+ }
72
+ }
73
+ }
74
+ }
75
+ catch (error) {
76
+ // Return empty structure on error (graceful degradation)
77
+ console.warn(`Warning: Could not analyze directories: ${error}`);
78
+ }
79
+ return result;
80
+ }
81
+ //# sourceMappingURL=directory-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory-analyzer.js","sourceRoot":"","sources":["../../src/utils/directory-analyzer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAuBH,gDAgEC;AArFD,wDAA0B;AAC1B,gDAAwB;AACxB,yDAAiD;AAWjD;;;;;;;GAOG;AACI,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,WAAwB;IAExB,MAAM,MAAM,GAAuB;QACjC,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,CAAC,GAAG,CAAC,CAAE,+BAA+B;KAC/C,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEnE,yDAAyD;QACzD,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QACjF,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1E,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,IAAI,WAAW,KAAK,8BAAW,CAAC,YAAY,EAAE,CAAC;YAC7C,gDAAgD;YAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBACvD,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3E,WAAW;yBACR,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;yBAC5B,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,wCAAwC;gBAC1C,CAAC;YACH,CAAC;YAED,wCAAwC;YACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBACnE,OAAO;yBACJ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;yBAC5B,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;gBAAC,MAAM,CAAC;oBACP,oCAAoC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yDAAyD;QACzD,OAAO,CAAC,IAAI,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,12 +1,12 @@
1
1
  /**
2
- * GitHub asset download utilities
2
+ * GitHub asset download utilities using @octokit/rest
3
3
  */
4
4
  /**
5
- * Download .github directory from private repo
5
+ * Download .github directory from private repo using GitHub client
6
6
  */
7
7
  export declare function downloadGithubAssets(repo?: string, branch?: string, targetDir?: string): Promise<void>;
8
8
  /**
9
- * Download config template from repo
9
+ * Download config template from repo using GitHub client
10
10
  */
11
11
  export declare function downloadConfigTemplate(repo?: string): Promise<string>;
12
12
  //# sourceMappingURL=downloader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/utils/downloader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,MAA4B,EAClC,MAAM,GAAE,MAAe,EACvB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,IAAI,CAAC,CAqEf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,GAAE,MAA4B,GACjC,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
1
+ {"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/utils/downloader.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,MAA4B,EAClC,MAAM,GAAE,MAAe,EACvB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,GAAE,MAA4B,GACjC,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * GitHub asset download utilities
3
+ * GitHub asset download utilities using @octokit/rest
4
4
  */
5
5
  var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -8,98 +8,68 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.downloadGithubAssets = downloadGithubAssets;
10
10
  exports.downloadConfigTemplate = downloadConfigTemplate;
11
- const execa_1 = require("execa");
12
11
  const fs_extra_1 = __importDefault(require("fs-extra"));
13
12
  const path_1 = __importDefault(require("path"));
14
13
  const constants_1 = require("../config/constants");
15
14
  const logger_1 = require("./logger");
15
+ const github_1 = require("../domains/github");
16
+ const progress_1 = require("./progress");
16
17
  /**
17
- * Download .github directory from private repo
18
+ * Download .github directory from private repo using GitHub client
18
19
  */
19
20
  async function downloadGithubAssets(repo = constants_1.CONSTANTS.REPO_FULL, branch = 'main', targetDir = process.cwd()) {
20
21
  const spinner = logger_1.logger.spinner(`Downloading assets from ${repo}...`);
21
- const tempDir = path_1.default.join(targetDir, '.csvibe-tmp');
22
22
  try {
23
- // Create temp directory
24
- await fs_extra_1.default.ensureDir(tempDir);
25
- // Clone repo with sparse checkout (only .github/)
26
- // Using gh repo clone with --depth=1 and --filter=blob:none
27
- await (0, execa_1.execa)('gh', [
28
- 'repo',
29
- 'clone',
30
- repo,
31
- tempDir,
32
- '--',
33
- '--depth=1',
34
- '--filter=blob:none',
35
- '--sparse'
36
- ]);
37
- // Sparse checkout .github/ directory
38
- await (0, execa_1.execa)('git', [
39
- '-C',
40
- tempDir,
41
- 'sparse-checkout',
42
- 'set',
43
- '.github'
44
- ]);
45
- // Copy .github/ to target directory
46
- const sourceGithub = path_1.default.join(tempDir, '.github');
47
- const targetGithub = path_1.default.join(targetDir, '.github');
48
- if (await fs_extra_1.default.pathExists(sourceGithub)) {
49
- // Copy agents
50
- await copyDirectory(path_1.default.join(sourceGithub, 'agents'), path_1.default.join(targetGithub, 'agents'));
51
- // Copy prompts (if exists)
52
- if (await fs_extra_1.default.pathExists(path_1.default.join(sourceGithub, 'prompts'))) {
53
- await copyDirectory(path_1.default.join(sourceGithub, 'prompts'), path_1.default.join(targetGithub, 'prompts'));
54
- }
55
- // Copy instructions (if exists)
56
- if (await fs_extra_1.default.pathExists(path_1.default.join(sourceGithub, 'instructions'))) {
57
- await copyDirectory(path_1.default.join(sourceGithub, 'instructions'), path_1.default.join(targetGithub, 'instructions'));
58
- }
59
- spinner.succeed('Assets downloaded successfully');
60
- }
61
- else {
23
+ const [owner, repoName] = repo.split('/');
24
+ const client = await github_1.GitHubClient.create();
25
+ // Download .github directory contents
26
+ const files = await client.downloadDirectory(owner, repoName, '.github', branch);
27
+ if (files.length === 0) {
62
28
  spinner.fail('No .github directory found in repository');
63
29
  throw new Error('Repository does not contain .github directory');
64
30
  }
31
+ // Create progress bar for file writing
32
+ const progressBar = (0, progress_1.createProgressBar)({
33
+ label: 'Writing files',
34
+ total: files.length,
35
+ unit: 'files',
36
+ });
37
+ let written = 0;
38
+ // Write files to target directory
39
+ for (const file of files) {
40
+ const targetPath = path_1.default.join(targetDir, file.path);
41
+ // Ensure directory exists
42
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(targetPath));
43
+ // Write file
44
+ await fs_extra_1.default.writeFile(targetPath, file.content);
45
+ // Update progress
46
+ written++;
47
+ progressBar.update(written);
48
+ }
49
+ progressBar.stop();
50
+ spinner.succeed(`Assets downloaded successfully (${files.length} files)`);
65
51
  }
66
52
  catch (error) {
67
53
  spinner.fail('Failed to download assets');
68
54
  throw error;
69
55
  }
70
- finally {
71
- // Cleanup temp directory
72
- await fs_extra_1.default.remove(tempDir);
73
- }
74
56
  }
75
57
  /**
76
- * Download config template from repo
58
+ * Download config template from repo using GitHub client
77
59
  */
78
60
  async function downloadConfigTemplate(repo = constants_1.CONSTANTS.REPO_FULL) {
79
61
  try {
80
- // Use gh api to get file content
81
- const { stdout } = await (0, execa_1.execa)('gh', [
82
- 'api',
83
- `repos/${repo}/contents/templates/config.yml.template`,
84
- '--jq',
85
- '.content'
86
- ]);
87
- // Decode base64 content
88
- const content = Buffer.from(stdout, 'base64').toString('utf-8');
89
- return content;
62
+ const [owner, repoName] = repo.split('/');
63
+ const client = await github_1.GitHubClient.create();
64
+ // Download config template
65
+ const content = await client.downloadFile(owner, repoName, 'templates/config.yml.template');
66
+ return content.toString('utf-8');
90
67
  }
91
68
  catch (error) {
92
69
  // Return default template if not found
93
70
  return getDefaultConfigTemplate();
94
71
  }
95
72
  }
96
- /**
97
- * Copy directory recursively
98
- */
99
- async function copyDirectory(src, dest) {
100
- await fs_extra_1.default.ensureDir(dest);
101
- await fs_extra_1.default.copy(src, dest, { overwrite: true });
102
- }
103
73
  /**
104
74
  * Default config template (fallback)
105
75
  */
@@ -1 +1 @@
1
- {"version":3,"file":"downloader.js","sourceRoot":"","sources":["../../src/utils/downloader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"downloader.js","sourceRoot":"","sources":["../../src/utils/downloader.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAYH,oDAiDC;AAKD,wDAmBC;AAnFD,wDAA0B;AAC1B,gDAAwB;AACxB,mDAAgD;AAChD,qCAAkC;AAClC,8CAAiD;AACjD,yCAA+C;AAE/C;;GAEG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAe,qBAAS,CAAC,SAAS,EAClC,SAAiB,MAAM,EACvB,YAAoB,OAAO,CAAC,GAAG,EAAE;IAEjC,MAAM,OAAO,GAAG,eAAM,CAAC,OAAO,CAAC,2BAA2B,IAAI,KAAK,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,qBAAY,CAAC,MAAM,EAAE,CAAC;QAE3C,sCAAsC;QACtC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAEjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,uCAAuC;QACvC,MAAM,WAAW,GAAG,IAAA,4BAAiB,EAAC;YACpC,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,kCAAkC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEnD,0BAA0B;YAC1B,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAE7C,aAAa;YACb,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAE7C,kBAAkB;YAClB,OAAO,EAAE,CAAC;YACV,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAED,WAAW,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,OAAO,CAAC,mCAAmC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,sBAAsB,CAC1C,OAAe,qBAAS,CAAC,SAAS;IAElC,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,qBAAY,CAAC,MAAM,EAAE,CAAC;QAE3C,2BAA2B;QAC3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CACvC,KAAK,EACL,QAAQ,EACR,+BAA+B,CAChC,CAAC;QAEF,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uCAAuC;QACvC,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCR,CAAC;AACF,CAAC"}
@@ -2,25 +2,79 @@
2
2
  * Error handling utilities and custom error classes
3
3
  */
4
4
  /**
5
- * Base error class for CSVibe CLI errors
5
+ * Abstract base error class for CSVibe CLI errors
6
+ * All custom errors should extend this class
6
7
  */
7
- export declare class CsvibeError extends Error {
8
- readonly code: string;
8
+ export declare abstract class CSVibeError extends Error {
9
9
  readonly exitCode: number;
10
- constructor(message: string, code: string, exitCode?: number);
10
+ abstract code: string;
11
+ abstract recoveryHint: string;
12
+ constructor(message: string, exitCode?: number);
11
13
  }
12
14
  /**
13
- * Error for gh CLI related issues
15
+ * GitHub authentication error
14
16
  */
15
- export declare class GhCliError extends CsvibeError {
16
- constructor(message: string, code: string);
17
+ export declare class GitHubAuthError extends CSVibeError {
18
+ code: string;
19
+ recoveryHint: string;
20
+ constructor(message?: string);
17
21
  }
18
22
  /**
19
- * Error for validation failures
23
+ * Project not found error
20
24
  */
21
- export declare class ValidationError extends CsvibeError {
22
- constructor(message: string, code: string);
25
+ export declare class ProjectNotFoundError extends CSVibeError {
26
+ code: string;
27
+ recoveryHint: string;
28
+ constructor(message?: string);
23
29
  }
30
+ /**
31
+ * Config validation error
32
+ */
33
+ export declare class ConfigValidationError extends CSVibeError {
34
+ code: string;
35
+ recoveryHint: string;
36
+ constructor(message?: string);
37
+ }
38
+ /**
39
+ * Network error
40
+ */
41
+ export declare class NetworkError extends CSVibeError {
42
+ code: string;
43
+ recoveryHint: string;
44
+ constructor(message?: string);
45
+ }
46
+ /**
47
+ * Dependency error
48
+ */
49
+ export declare class DependencyError extends CSVibeError {
50
+ code: string;
51
+ recoveryHint: string;
52
+ constructor(message?: string);
53
+ }
54
+ /**
55
+ * Legacy error classes for backward compatibility
56
+ */
57
+ export declare class CsvibeError extends CSVibeError {
58
+ code: string;
59
+ recoveryHint: string;
60
+ constructor(message: string, code?: string, exitCode?: number);
61
+ }
62
+ export declare class GhCliError extends GitHubAuthError {
63
+ constructor(message: string, _code?: string);
64
+ }
65
+ export declare class ValidationError extends CSVibeError {
66
+ code: string;
67
+ recoveryHint: string;
68
+ constructor(message: string, code?: string);
69
+ }
70
+ /**
71
+ * Format error with color-coded output and recovery hints
72
+ */
73
+ export declare function formatError(error: CSVibeError): string;
74
+ /**
75
+ * Log error to file for debugging
76
+ */
77
+ export declare function logError(error: Error): Promise<void>;
24
78
  /**
25
79
  * Global error handler for CLI
26
80
  */
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAGlB,IAAI,EAAE,MAAM;aACZ,QAAQ,EAAE,MAAM;gBAFhC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAU;CAKvC;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,WAAW;gBAC7B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;gBAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAejD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAC1E,EAAE,EAAE,CAAC,GACJ,CAAC,CAQH"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;;GAGG;AACH,8BAAsB,WAAY,SAAQ,KAAK;aAM3B,QAAQ,EAAE,MAAM;IALlC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAG5B,OAAO,EAAE,MAAM,EACC,QAAQ,GAAE,MAAU;CAMvC;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,SAAe;IACnB,YAAY,SAA+F;gBAE/F,OAAO,GAAE,MAAuC;CAG7D;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,IAAI,SAAyB;IAC7B,YAAY,SAAkG;gBAElG,OAAO,GAAE,MAA0C;CAGhE;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,IAAI,SAAsB;IAC1B,YAAY,SAA2E;gBAE3E,OAAO,GAAE,MAA0C;CAGhE;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,IAAI,SAAe;IACnB,YAAY,SAAyF;gBAEzF,OAAO,GAAE,MAAiC;CAGvD;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,SAAkB;IACtB,YAAY,SAAiE;gBAEjE,OAAO,GAAE,MAAwC;CAG9D;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,IAAI,SAAe;IACnB,YAAY,SAAmF;gBAG7F,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,GAAE,MAAU;CAKvB;AAED,qBAAa,UAAW,SAAQ,eAAe;gBACjC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAG5C;AAED,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,SAAkB;IACtB,YAAY,SAAoD;gBAEpD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAI3C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAkBtD;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAkBjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAC1E,EAAE,EAAE,CAAC,GACJ,CAAC,CAQH"}
@@ -6,54 +6,168 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  return (mod && mod.__esModule) ? mod : { "default": mod };
7
7
  };
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.ValidationError = exports.GhCliError = exports.CsvibeError = void 0;
9
+ exports.ValidationError = exports.GhCliError = exports.CsvibeError = exports.DependencyError = exports.NetworkError = exports.ConfigValidationError = exports.ProjectNotFoundError = exports.GitHubAuthError = exports.CSVibeError = void 0;
10
+ exports.formatError = formatError;
11
+ exports.logError = logError;
10
12
  exports.handleError = handleError;
11
13
  exports.withErrorHandling = withErrorHandling;
12
14
  const chalk_1 = __importDefault(require("chalk"));
15
+ const fs_extra_1 = __importDefault(require("fs-extra"));
16
+ const path_1 = __importDefault(require("path"));
17
+ const os_1 = __importDefault(require("os"));
13
18
  /**
14
- * Base error class for CSVibe CLI errors
19
+ * Abstract base error class for CSVibe CLI errors
20
+ * All custom errors should extend this class
15
21
  */
16
- class CsvibeError extends Error {
17
- constructor(message, code, exitCode = 1) {
22
+ class CSVibeError extends Error {
23
+ constructor(message, exitCode = 1) {
18
24
  super(message);
19
- this.code = code;
20
25
  this.exitCode = exitCode;
21
- this.name = 'CsvibeError';
26
+ this.name = this.constructor.name;
27
+ Error.captureStackTrace(this, this.constructor);
22
28
  }
23
29
  }
24
- exports.CsvibeError = CsvibeError;
30
+ exports.CSVibeError = CSVibeError;
25
31
  /**
26
- * Error for gh CLI related issues
32
+ * GitHub authentication error
27
33
  */
28
- class GhCliError extends CsvibeError {
29
- constructor(message, code) {
30
- super(message, code, 1);
31
- this.name = 'GhCliError';
34
+ class GitHubAuthError extends CSVibeError {
35
+ constructor(message = 'GitHub authentication failed') {
36
+ super(message, 1);
37
+ this.code = 'E_GH_AUTH';
38
+ this.recoveryHint = 'Run "gh auth login" to authenticate with GitHub, or set GITHUB_TOKEN environment variable';
32
39
  }
33
40
  }
34
- exports.GhCliError = GhCliError;
41
+ exports.GitHubAuthError = GitHubAuthError;
42
+ /**
43
+ * Project not found error
44
+ */
45
+ class ProjectNotFoundError extends CSVibeError {
46
+ constructor(message = 'Project configuration not found') {
47
+ super(message, 1);
48
+ this.code = 'E_PROJECT_NOT_FOUND';
49
+ this.recoveryHint = 'Ensure you are in a valid project directory with package.json, pyproject.toml, or Cargo.toml';
50
+ }
51
+ }
52
+ exports.ProjectNotFoundError = ProjectNotFoundError;
35
53
  /**
36
- * Error for validation failures
54
+ * Config validation error
37
55
  */
38
- class ValidationError extends CsvibeError {
56
+ class ConfigValidationError extends CSVibeError {
57
+ constructor(message = 'Configuration validation failed') {
58
+ super(message, 1);
59
+ this.code = 'E_CONFIG_INVALID';
60
+ this.recoveryHint = 'Check .csvibe/config.yml for syntax errors or missing required fields';
61
+ }
62
+ }
63
+ exports.ConfigValidationError = ConfigValidationError;
64
+ /**
65
+ * Network error
66
+ */
67
+ class NetworkError extends CSVibeError {
68
+ constructor(message = 'Network request failed') {
69
+ super(message, 1);
70
+ this.code = 'E_NETWORK';
71
+ this.recoveryHint = 'Check your internet connection and GitHub API status (https://www.githubstatus.com)';
72
+ }
73
+ }
74
+ exports.NetworkError = NetworkError;
75
+ /**
76
+ * Dependency error
77
+ */
78
+ class DependencyError extends CSVibeError {
79
+ constructor(message = 'Required dependency not found') {
80
+ super(message, 1);
81
+ this.code = 'E_DEPENDENCY';
82
+ this.recoveryHint = 'Install the missing dependency or ensure it is in your PATH';
83
+ }
84
+ }
85
+ exports.DependencyError = DependencyError;
86
+ /**
87
+ * Legacy error classes for backward compatibility
88
+ */
89
+ class CsvibeError extends CSVibeError {
90
+ constructor(message, code, exitCode = 1) {
91
+ super(message, exitCode);
92
+ this.code = 'E_UNKNOWN';
93
+ this.recoveryHint = 'Please report this issue at https://github.com/thanhvn14/csvibe-engine/issues';
94
+ if (code)
95
+ this.code = code;
96
+ }
97
+ }
98
+ exports.CsvibeError = CsvibeError;
99
+ class GhCliError extends GitHubAuthError {
100
+ constructor(message, _code) {
101
+ super(message);
102
+ }
103
+ }
104
+ exports.GhCliError = GhCliError;
105
+ class ValidationError extends CSVibeError {
39
106
  constructor(message, code) {
40
- super(message, code, 1);
41
- this.name = 'ValidationError';
107
+ super(message, 1);
108
+ this.code = 'E_VALIDATION';
109
+ this.recoveryHint = 'Check the validation error message for details';
110
+ if (code)
111
+ this.code = code;
42
112
  }
43
113
  }
44
114
  exports.ValidationError = ValidationError;
115
+ /**
116
+ * Format error with color-coded output and recovery hints
117
+ */
118
+ function formatError(error) {
119
+ const lines = [
120
+ '',
121
+ chalk_1.default.red.bold('āœ— Error: ') + chalk_1.default.white(error.message),
122
+ chalk_1.default.gray(' Code: ') + chalk_1.default.yellow(error.code),
123
+ '',
124
+ chalk_1.default.cyan('šŸ’” Recovery Hint:'),
125
+ chalk_1.default.white(' ' + error.recoveryHint),
126
+ ''
127
+ ];
128
+ if (error.stack && process.env.VERBOSE) {
129
+ lines.push(chalk_1.default.gray('Stack trace:'));
130
+ lines.push(chalk_1.default.gray(error.stack));
131
+ lines.push('');
132
+ }
133
+ return lines.join('\n');
134
+ }
135
+ /**
136
+ * Log error to file for debugging
137
+ */
138
+ async function logError(error) {
139
+ try {
140
+ const logDir = path_1.default.join(os_1.default.homedir(), '.csvibe', 'logs');
141
+ await fs_extra_1.default.ensureDir(logDir);
142
+ const logFile = path_1.default.join(logDir, 'errors.log');
143
+ const timestamp = new Date().toISOString();
144
+ const logEntry = [
145
+ `[${timestamp}] ${error.name}: ${error.message}`,
146
+ error.stack || '',
147
+ '---',
148
+ ''
149
+ ].join('\n');
150
+ await fs_extra_1.default.appendFile(logFile, logEntry);
151
+ }
152
+ catch (logErr) {
153
+ // Silent fail - don't crash on logging errors
154
+ }
155
+ }
45
156
  /**
46
157
  * Global error handler for CLI
47
158
  */
48
159
  function handleError(error) {
49
- if (error instanceof CsvibeError) {
50
- // Custom errors already have formatted messages
51
- console.error('\n' + error.message);
160
+ if (error instanceof CSVibeError) {
161
+ // Format and display custom errors with recovery hints
162
+ console.error(formatError(error));
163
+ logError(error).catch(() => { }); // Async log, don't wait
52
164
  process.exit(error.exitCode);
53
165
  }
54
166
  else if (error instanceof Error) {
55
- // Generic errors
56
- console.error(chalk_1.default.red('\nāœ— Error: ') + error.message + '\n');
167
+ // Generic errors - wrap in CSVibeError
168
+ const wrappedError = new CsvibeError(error.message);
169
+ console.error(formatError(wrappedError));
170
+ logError(error).catch(() => { });
57
171
  process.exit(1);
58
172
  }
59
173
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAyCH,kCAeC;AAKD,8CAUC;AArED,kDAA0B;AAE1B;;GAEG;AACH,MAAa,WAAY,SAAQ,KAAK;IACpC,YACE,OAAe,EACC,IAAY,EACZ,WAAmB,CAAC;QAEpC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAY;QAGpC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AATD,kCASC;AAED;;GAEG;AACH,MAAa,UAAW,SAAQ,WAAW;IACzC,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AALD,gCAKC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,WAAW;IAC9C,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,gDAAgD;QAChD,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,iBAAiB;QACjB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,iBAAiB;QACjB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAC/B,EAAK;IAEL,OAAO,CAAC,KAAK,EAAE,GAAG,IAAmB,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAM,CAAC;AACV,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * GitHub CLI (gh) validation and operations
3
+ * Now uses multi-tier authentication and @octokit/rest
3
4
  */
4
5
  /**
5
6
  * Check if gh CLI is installed
@@ -21,9 +22,10 @@ export declare function isGhAuthenticated(): Promise<boolean>;
21
22
  */
22
23
  export declare function checkRepoAccess(repo: string): Promise<boolean>;
23
24
  /**
24
- * Validate all gh CLI prerequisites
25
+ * Validate GitHub authentication and repository access
26
+ * Uses multi-tier authentication (gh CLI → env → config → keychain → prompt)
25
27
  * @param repo - Repository to check access (default: csvibe-engine)
26
- * @throws {GhCliError} If validation fails
28
+ * @throws {GitHubAuthError} If validation fails
27
29
  */
28
30
  export declare function validateGhCli(repo?: string): Promise<void>;
29
31
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"gh-cli.d.ts","sourceRoot":"","sources":["../../src/utils/gh-cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAOtD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS3D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO1D;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYpE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,MAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CAgErF;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO5D"}
1
+ {"version":3,"file":"gh-cli.d.ts","sourceRoot":"","sources":["../../src/utils/gh-cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAOtD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS3D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO1D;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYpE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,MAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDrF;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO5D"}