@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,116 @@
1
+ "use strict";
2
+ /**
3
+ * Scout command - Analyze project structure for vibecoding
4
+ * Gathers context about project type, tech stack, dependencies, and directory structure
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.scoutCommand = scoutCommand;
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const ora_1 = __importDefault(require("ora"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const fs_extra_1 = __importDefault(require("fs-extra"));
15
+ const project_detector_1 = require("../utils/project-detector");
16
+ const dependency_analyzer_1 = require("../utils/dependency-analyzer");
17
+ const directory_analyzer_1 = require("../utils/directory-analyzer");
18
+ const constants_1 = require("../config/constants");
19
+ /**
20
+ * Scout command - Main entry point
21
+ * Analyzes project structure and outputs context to JSON
22
+ *
23
+ * @param options - Command options
24
+ */
25
+ async function scoutCommand(options = {}) {
26
+ console.log(chalk_1.default.bold.cyan('\n🔍 Scouting Project...\n'));
27
+ const projectRoot = process.cwd();
28
+ const outputPath = options.output || path_1.default.join(projectRoot, constants_1.CONSTANTS.STATE_DIR, 'scout-context.json');
29
+ try {
30
+ // Step 1: Validate state directory
31
+ const spinner1 = (0, ora_1.default)('Validating project structure').start();
32
+ const stateDir = path_1.default.join(projectRoot, constants_1.CONSTANTS.STATE_DIR);
33
+ if (!await fs_extra_1.default.pathExists(stateDir)) {
34
+ spinner1.fail('Project not initialized');
35
+ throw new Error('Run `csvibe init` first to set up project');
36
+ }
37
+ spinner1.succeed('Project structure validated');
38
+ // Step 2: Detect project type
39
+ const spinner2 = (0, ora_1.default)('Detecting project type').start();
40
+ const projectType = await (0, project_detector_1.detectProjectType)(projectRoot);
41
+ spinner2.succeed(`Project type: ${chalk_1.default.cyan(projectType)}`);
42
+ // Step 3: Analyze directories
43
+ const spinner3 = (0, ora_1.default)('Analyzing directory structure').start();
44
+ const directories = await (0, directory_analyzer_1.analyzeDirectories)(projectRoot, projectType);
45
+ const sourceCount = directories.source.length;
46
+ spinner3.succeed(`Found ${chalk_1.default.cyan(sourceCount)} source ${sourceCount === 1 ? 'directory' : 'directories'}`);
47
+ // Step 4: Analyze dependencies
48
+ const spinner4 = (0, ora_1.default)('Extracting dependencies').start();
49
+ const dependencies = await (0, dependency_analyzer_1.analyzeDependencies)(projectRoot, projectType);
50
+ const depCount = Object.keys(dependencies).length;
51
+ spinner4.succeed(`Extracted ${chalk_1.default.cyan(depCount)} ${depCount === 1 ? 'dependency' : 'dependencies'}`);
52
+ // Step 5: Infer tech stack
53
+ const spinner5 = (0, ora_1.default)('Inferring tech stack').start();
54
+ const techStack = (0, dependency_analyzer_1.inferTechStack)(dependencies, projectType);
55
+ if (techStack.length > 0) {
56
+ spinner5.succeed(`Tech stack: ${chalk_1.default.cyan(techStack.join(', '))}`);
57
+ }
58
+ else {
59
+ spinner5.succeed('Tech stack: None detected');
60
+ }
61
+ // Step 6: Detect build tool
62
+ const spinner6 = (0, ora_1.default)('Detecting build tool').start();
63
+ const buildTool = await (0, dependency_analyzer_1.detectBuildTool)(projectRoot, projectType);
64
+ spinner6.succeed(`Build tool: ${chalk_1.default.cyan(buildTool)}`);
65
+ // Step 7: Generate architecture summary
66
+ const architecture = generateArchitectureSummary(projectType, directories, techStack);
67
+ // Step 8: Write output
68
+ const spinner7 = (0, ora_1.default)('Writing context file').start();
69
+ const context = {
70
+ projectType,
71
+ techStack,
72
+ directories,
73
+ dependencies,
74
+ buildTool,
75
+ architecture
76
+ };
77
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(outputPath));
78
+ await fs_extra_1.default.writeJson(outputPath, context, { spaces: 2 });
79
+ spinner7.succeed('Context saved');
80
+ // Success message
81
+ console.log(chalk_1.default.bold.green('\n✓ Scout phase complete!\n'));
82
+ console.log(chalk_1.default.gray('Context saved to: ') + chalk_1.default.cyan(path_1.default.relative(process.cwd(), outputPath)));
83
+ console.log(chalk_1.default.gray('\nNext step: ') + chalk_1.default.cyan('csvibe run --phase=brainstorm\n'));
84
+ }
85
+ catch (error) {
86
+ if (error instanceof Error) {
87
+ console.error(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
88
+ }
89
+ else {
90
+ console.error(chalk_1.default.red('\n✗ An unexpected error occurred during scout phase\n'));
91
+ }
92
+ process.exit(1);
93
+ }
94
+ }
95
+ /**
96
+ * Generate human-readable architecture summary
97
+ *
98
+ * @param projectType - Detected project type
99
+ * @param directories - Analyzed directory structure
100
+ * @param techStack - Inferred tech stack
101
+ * @returns Architecture summary string
102
+ */
103
+ function generateArchitectureSummary(projectType, directories, techStack) {
104
+ const parts = [projectType];
105
+ // Add primary technologies (limit to top 3)
106
+ if (techStack.length > 0) {
107
+ const topTech = techStack.slice(0, 3).join(', ');
108
+ parts.push(`with ${topTech}`);
109
+ }
110
+ // Add structure info for monorepos
111
+ if (directories.source.length > 1) {
112
+ parts.push('(multi-package structure)');
113
+ }
114
+ return parts.join(' ');
115
+ }
116
+ //# sourceMappingURL=scout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scout.js","sourceRoot":"","sources":["../../src/commands/scout.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAwCH,oCA8EC;AApHD,kDAA0B;AAC1B,8CAAsB;AACtB,gDAAwB;AACxB,wDAA0B;AAC1B,gEAA2E;AAC3E,sEAIsC;AACtC,oEAAqF;AACrF,mDAAgD;AAqBhD;;;;;GAKG;AACI,KAAK,UAAU,YAAY,CAAC,UAAwB,EAAE;IAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAE3D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAEvG,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAA,aAAG,EAAC,8BAA8B,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAS,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAEhD,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAA,aAAG,EAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,IAAA,oCAAiB,EAAC,WAAW,CAAC,CAAC;QACzD,QAAQ,CAAC,OAAO,CAAC,iBAAiB,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAE7D,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAA,aAAG,EAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;QAC9D,MAAM,WAAW,GAAG,MAAM,IAAA,uCAAkB,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9C,QAAQ,CAAC,OAAO,CAAC,SAAS,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAE/G,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,IAAA,aAAG,EAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;QACxD,MAAM,YAAY,GAAG,MAAM,IAAA,yCAAmB,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;QAClD,QAAQ,CAAC,OAAO,CAAC,aAAa,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QAExG,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAA,aAAG,EAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,IAAA,oCAAc,EAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC5D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,OAAO,CAAC,eAAe,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAChD,CAAC;QAED,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,IAAA,aAAG,EAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,MAAM,IAAA,qCAAe,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAClE,QAAQ,CAAC,OAAO,CAAC,eAAe,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAEzD,wCAAwC;QACxC,MAAM,YAAY,GAAG,2BAA2B,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAEtF,uBAAuB;QACvB,MAAM,QAAQ,GAAG,IAAA,aAAG,EAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;QACrD,MAAM,OAAO,GAAiB;YAC5B,WAAW;YACX,SAAS;YACT,WAAW;YACX,YAAY;YACZ,SAAS;YACT,YAAY;SACb,CAAC;QAEF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7C,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAElC,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAE3F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,2BAA2B,CAClC,WAAmB,EACnB,WAA+B,EAC/B,SAAmB;IAEnB,MAAM,KAAK,GAAa,CAAC,WAAW,CAAC,CAAC;IAEtC,4CAA4C;IAC5C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,mCAAmC;IACnC,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -12,7 +12,8 @@ export declare const CONSTANTS: {
12
12
  readonly CSVIBE_DIR: ".csvibe";
13
13
  readonly AGENTS_DIR: ".github/agents";
14
14
  readonly PROMPTS_DIR: ".github/prompts";
15
- readonly INSTRUCTIONS_DIR: ".github/instructions";
15
+ readonly SCRIPTS_DIR: ".github/agents/scripts";
16
+ readonly SCHEMAS_DIR: ".github/agents/schemas";
16
17
  readonly STATE_DIR: ".csvibe/state";
17
18
  readonly CACHE_DIR: ".csvibe/cache";
18
19
  readonly CONFIG_FILE: ".csvibe/config.yml";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;CA+BZ,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;CAgCZ,CAAC"}
@@ -21,7 +21,8 @@ exports.CONSTANTS = {
21
21
  CSVIBE_DIR: '.csvibe',
22
22
  AGENTS_DIR: '.github/agents',
23
23
  PROMPTS_DIR: '.github/prompts',
24
- INSTRUCTIONS_DIR: '.github/instructions',
24
+ SCRIPTS_DIR: '.github/agents/scripts',
25
+ SCHEMAS_DIR: '.github/agents/schemas',
25
26
  STATE_DIR: '.csvibe/state',
26
27
  CACHE_DIR: '.csvibe/cache',
27
28
  // Config file
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,SAAS,GAAG;IACvB,qBAAqB;IACrB,UAAU,EAAE,cAAc,EAAG,sBAAsB;IACnD,SAAS,EAAE,eAAe;IAC1B,IAAI,SAAS;QACX,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;IAChD,CAAC;IAED,mBAAmB;IACnB,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,OAAO;IAEvB,mBAAmB;IACnB,WAAW,EAAE,wBAAwB;IAErC,cAAc;IACd,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,gBAAgB;IAC5B,WAAW,EAAE,iBAAiB;IAC9B,gBAAgB,EAAE,sBAAsB;IACxC,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,eAAe;IAE1B,cAAc;IACd,WAAW,EAAE,oBAAoB;IAEjC,OAAO;IACP,QAAQ,EAAE,+CAA+C;IACzD,UAAU,EAAE,sDAAsD;IAClE,cAAc,EAAE,yCAAyC;CACjD,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,SAAS,GAAG;IACvB,qBAAqB;IACrB,UAAU,EAAE,cAAc,EAAG,sBAAsB;IACnD,SAAS,EAAE,eAAe;IAC1B,IAAI,SAAS;QACX,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;IAChD,CAAC;IAED,mBAAmB;IACnB,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,OAAO;IAEvB,mBAAmB;IACnB,WAAW,EAAE,wBAAwB;IAErC,cAAc;IACd,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,gBAAgB;IAC5B,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EAAE,wBAAwB;IACrC,WAAW,EAAE,wBAAwB;IACrC,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,eAAe;IAE1B,cAAc;IACd,WAAW,EAAE,oBAAoB;IAEjC,OAAO;IACP,QAAQ,EAAE,+CAA+C;IACzD,UAAU,EAAE,sDAAsD;IAClE,cAAc,EAAE,yCAAyC;CACjD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configuration file generation
3
+ */
4
+ import type { ConfigOptions, CSVibeConfig } from './types';
5
+ /**
6
+ * Generate config.yml from template and options
7
+ */
8
+ export declare function generateConfig(template: string, options: ConfigOptions): Promise<void>;
9
+ /**
10
+ * Check if CSVibe is already initialized
11
+ */
12
+ export declare function isInitialized(dir?: string): Promise<boolean>;
13
+ /**
14
+ * Load existing config
15
+ */
16
+ export declare function loadConfig(dir?: string): Promise<CSVibeConfig>;
17
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/domains/config/generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE3D;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAInF"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration file generation
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.generateConfig = generateConfig;
10
+ exports.isInitialized = isInitialized;
11
+ exports.loadConfig = loadConfig;
12
+ const fs_extra_1 = __importDefault(require("fs-extra"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const yaml_1 = __importDefault(require("yaml"));
15
+ /**
16
+ * Generate config.yml from template and options
17
+ */
18
+ async function generateConfig(template, options) {
19
+ const targetDir = options.targetDir || process.cwd();
20
+ const configPath = path_1.default.join(targetDir, '.csvibe', 'config.yml');
21
+ // Ensure .csvibe directory exists
22
+ await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, '.csvibe'));
23
+ // Replace template placeholders
24
+ let config = template
25
+ .replace(/{{GENERATED_DATE}}/g, new Date().toISOString())
26
+ .replace(/{{PROJECT_NAME}}/g, options.projectName)
27
+ .replace(/{{PROJECT_TYPE}}/g, options.projectType)
28
+ .replace(/{{PROJECT_VERSION}}/g, options.projectVersion);
29
+ // Replace Jira placeholders if credentials provided
30
+ if (options.jiraCredentials) {
31
+ config = config
32
+ .replace(/{{JIRA_URL}}/g, options.jiraCredentials.url)
33
+ .replace(/{{JIRA_EMAIL}}/g, options.jiraCredentials.email)
34
+ .replace(/{{JIRA_API_TOKEN}}/g, options.jiraCredentials.apiToken)
35
+ .replace(/{{JIRA_PROJECT_KEY}}/g, options.jiraCredentials.projectKey);
36
+ }
37
+ else {
38
+ // Use placeholder values for unconfigured Jira
39
+ config = config
40
+ .replace(/{{JIRA_URL}}/g, '')
41
+ .replace(/{{JIRA_EMAIL}}/g, '')
42
+ .replace(/{{JIRA_API_TOKEN}}/g, '')
43
+ .replace(/{{JIRA_PROJECT_KEY}}/g, '');
44
+ }
45
+ // Write config file
46
+ await fs_extra_1.default.writeFile(configPath, config, 'utf-8');
47
+ // Set restrictive permissions (config contains sensitive data)
48
+ if (process.platform !== 'win32') {
49
+ await fs_extra_1.default.chmod(configPath, 0o600); // rw------- (owner only)
50
+ }
51
+ }
52
+ /**
53
+ * Check if CSVibe is already initialized
54
+ */
55
+ async function isInitialized(dir = process.cwd()) {
56
+ const configPath = path_1.default.join(dir, '.csvibe', 'config.yml');
57
+ return await fs_extra_1.default.pathExists(configPath);
58
+ }
59
+ /**
60
+ * Load existing config
61
+ */
62
+ async function loadConfig(dir = process.cwd()) {
63
+ const configPath = path_1.default.join(dir, '.csvibe', 'config.yml');
64
+ const content = await fs_extra_1.default.readFile(configPath, 'utf-8');
65
+ return yaml_1.default.parse(content);
66
+ }
67
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/domains/config/generator.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAUH,wCAwCC;AAKD,sCAGC;AAKD,gCAIC;AAjED,wDAA0B;AAC1B,gDAAwB;AACxB,gDAAwB;AAGxB;;GAEG;AACI,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,OAAsB;IAEtB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAEjE,kCAAkC;IAClC,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEpD,gCAAgC;IAChC,IAAI,MAAM,GAAG,QAAQ;SAClB,OAAO,CAAC,qBAAqB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SACxD,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,WAAW,CAAC;SACjD,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,WAAW,CAAC;SACjD,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAE3D,oDAAoD;IACpD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM;aACZ,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC;aACrD,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC;aACzD,OAAO,CAAC,qBAAqB,EAAE,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC;aAChE,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,+CAA+C;QAC/C,MAAM,GAAG,MAAM;aACZ,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;aAC5B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;aAC9B,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;aAClC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,oBAAoB;IACpB,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhD,+DAA+D;IAC/D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,kBAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,yBAAyB;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC7D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC3D,OAAO,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,cAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Config domain facade
3
+ * Public API for configuration management
4
+ */
5
+ export { generateConfig, isInitialized, loadConfig } from './generator';
6
+ export { validateConfig, isValidConfig, type ValidationError } from './validator';
7
+ export type { ConfigOptions, CSVibeConfig } from './types';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domains/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAClF,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * Config domain facade
4
+ * Public API for configuration management
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isValidConfig = exports.validateConfig = exports.loadConfig = exports.isInitialized = exports.generateConfig = void 0;
8
+ var generator_1 = require("./generator");
9
+ Object.defineProperty(exports, "generateConfig", { enumerable: true, get: function () { return generator_1.generateConfig; } });
10
+ Object.defineProperty(exports, "isInitialized", { enumerable: true, get: function () { return generator_1.isInitialized; } });
11
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return generator_1.loadConfig; } });
12
+ var validator_1 = require("./validator");
13
+ Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return validator_1.validateConfig; } });
14
+ Object.defineProperty(exports, "isValidConfig", { enumerable: true, get: function () { return validator_1.isValidConfig; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domains/config/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yCAAwE;AAA/D,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,uGAAA,UAAU,OAAA;AAClD,yCAAkF;AAAzE,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Config domain types
3
+ */
4
+ import type { JiraCredentials } from '../../utils/prompts';
5
+ import type { ProjectType } from '../../utils/project-detector';
6
+ export interface ConfigOptions {
7
+ projectName: string;
8
+ projectType: ProjectType;
9
+ projectVersion: string;
10
+ jiraCredentials: JiraCredentials | null;
11
+ targetDir?: string;
12
+ }
13
+ export interface CSVibeConfig {
14
+ project: {
15
+ name: string;
16
+ type: string;
17
+ version: string;
18
+ };
19
+ github: {
20
+ private_repo: string;
21
+ branch: string;
22
+ };
23
+ jira: {
24
+ url: string;
25
+ email: string;
26
+ api_token: string;
27
+ project_key: string;
28
+ };
29
+ pipeline: {
30
+ phases: string[];
31
+ enabled: boolean;
32
+ dry_run: boolean;
33
+ };
34
+ vscode: {
35
+ copilot_required: boolean;
36
+ workspace_path: string;
37
+ };
38
+ }
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/domains/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,MAAM,EAAE;QACN,gBAAgB,EAAE,OAAO,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Config domain types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/domains/config/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configuration validation
3
+ */
4
+ import type { CSVibeConfig } from './types';
5
+ export interface ValidationError {
6
+ field: string;
7
+ message: string;
8
+ }
9
+ /**
10
+ * Validate config structure
11
+ */
12
+ export declare function validateConfig(config: CSVibeConfig): ValidationError[];
13
+ /**
14
+ * Check if config is valid (no errors)
15
+ */
16
+ export declare function isValidConfig(config: CSVibeConfig): boolean;
17
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/domains/config/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,EAAE,CAyCtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE3D"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration validation
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateConfig = validateConfig;
7
+ exports.isValidConfig = isValidConfig;
8
+ /**
9
+ * Validate config structure
10
+ */
11
+ function validateConfig(config) {
12
+ const errors = [];
13
+ // Validate project section
14
+ if (!config.project?.name) {
15
+ errors.push({ field: 'project.name', message: 'Project name is required' });
16
+ }
17
+ if (!config.project?.type) {
18
+ errors.push({ field: 'project.type', message: 'Project type is required' });
19
+ }
20
+ if (!config.project?.version) {
21
+ errors.push({ field: 'project.version', message: 'Project version is required' });
22
+ }
23
+ // Validate Jira section
24
+ if (!config.jira?.url) {
25
+ errors.push({ field: 'jira.url', message: 'Jira URL is required' });
26
+ }
27
+ else if (!config.jira.url.startsWith('http')) {
28
+ errors.push({ field: 'jira.url', message: 'Jira URL must start with http:// or https://' });
29
+ }
30
+ if (!config.jira?.email) {
31
+ errors.push({ field: 'jira.email', message: 'Jira email is required' });
32
+ }
33
+ else if (!config.jira.email.includes('@')) {
34
+ errors.push({ field: 'jira.email', message: 'Jira email must be valid' });
35
+ }
36
+ if (!config.jira?.api_token) {
37
+ errors.push({ field: 'jira.api_token', message: 'Jira API token is required' });
38
+ }
39
+ if (!config.jira?.project_key) {
40
+ errors.push({ field: 'jira.project_key', message: 'Jira project key is required' });
41
+ }
42
+ // Validate pipeline section
43
+ if (!Array.isArray(config.pipeline?.phases)) {
44
+ errors.push({ field: 'pipeline.phases', message: 'Pipeline phases must be an array' });
45
+ }
46
+ return errors;
47
+ }
48
+ /**
49
+ * Check if config is valid (no errors)
50
+ */
51
+ function isValidConfig(config) {
52
+ return validateConfig(config).length === 0;
53
+ }
54
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/domains/config/validator.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAYH,wCAyCC;AAKD,sCAEC;AAnDD;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAoB;IACjD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,MAAoB;IAChD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Multi-tier GitHub authentication system
3
+ * Implements 5-tier fallback: gh CLI → env → config → keychain → prompt
4
+ */
5
+ import type { AuthMethod, GitHubTokenInfo } from './types';
6
+ /**
7
+ * Get GitHub token using 5-tier fallback strategy
8
+ * @throws {GitHubAuthError} if no authentication method available
9
+ */
10
+ export declare function getGitHubToken(): Promise<GitHubTokenInfo>;
11
+ /**
12
+ * Validate GitHub token by making a test API call
13
+ */
14
+ export declare function validateToken(token: string): Promise<boolean>;
15
+ /**
16
+ * Get authentication method description for logging
17
+ */
18
+ export declare function getAuthMethodDescription(method: AuthMethod): string;
19
+ //# sourceMappingURL=auth-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-api.d.ts","sourceRoot":"","sources":["../../../src/domains/github/auth-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE3D;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAkC/D;AA+FD;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAUnE"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * Multi-tier GitHub authentication system
4
+ * Implements 5-tier fallback: gh CLI → env → config → keychain → prompt
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.getGitHubToken = getGitHubToken;
44
+ exports.validateToken = validateToken;
45
+ exports.getAuthMethodDescription = getAuthMethodDescription;
46
+ const child_process_1 = require("child_process");
47
+ const fs_extra_1 = __importDefault(require("fs-extra"));
48
+ const path_1 = __importDefault(require("path"));
49
+ const yaml_1 = __importDefault(require("yaml"));
50
+ const p = __importStar(require("@clack/prompts"));
51
+ const chalk_1 = __importDefault(require("chalk"));
52
+ const errors_1 = require("../../utils/errors");
53
+ const keychain_1 = require("./keychain");
54
+ /**
55
+ * Get GitHub token using 5-tier fallback strategy
56
+ * @throws {GitHubAuthError} if no authentication method available
57
+ */
58
+ async function getGitHubToken() {
59
+ // Tier 1: GitHub CLI
60
+ const ghCliToken = tryGitHubCLI();
61
+ if (ghCliToken) {
62
+ return { token: ghCliToken, method: 'gh-cli' };
63
+ }
64
+ // Tier 2: Environment Variables
65
+ const envToken = tryEnvironmentVariable();
66
+ if (envToken) {
67
+ return { token: envToken, method: 'env-var' };
68
+ }
69
+ // Tier 3: Config File
70
+ const configToken = await tryConfigFile();
71
+ if (configToken) {
72
+ return { token: configToken, method: 'config' };
73
+ }
74
+ // Tier 4: OS Keychain
75
+ const keychainToken = await tryKeychain();
76
+ if (keychainToken) {
77
+ return { token: keychainToken, method: 'keychain' };
78
+ }
79
+ // Tier 5: User Prompt
80
+ const promptedToken = await promptForToken();
81
+ if (promptedToken) {
82
+ // Save to keychain for future use
83
+ await (0, keychain_1.saveTokenToKeychain)(promptedToken);
84
+ return { token: promptedToken, method: 'prompt' };
85
+ }
86
+ throw new errors_1.GitHubAuthError('No GitHub authentication method available');
87
+ }
88
+ /**
89
+ * Tier 1: Try GitHub CLI authentication
90
+ */
91
+ function tryGitHubCLI() {
92
+ try {
93
+ const token = (0, child_process_1.execSync)('gh auth token', {
94
+ encoding: 'utf-8',
95
+ stdio: ['pipe', 'pipe', 'ignore'],
96
+ }).trim();
97
+ if (token && token.length > 0 && !token.includes('not logged in')) {
98
+ return token;
99
+ }
100
+ }
101
+ catch (error) {
102
+ // gh CLI not available or not authenticated
103
+ }
104
+ return null;
105
+ }
106
+ /**
107
+ * Tier 2: Try environment variables
108
+ */
109
+ function tryEnvironmentVariable() {
110
+ const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
111
+ return token && token.length > 0 ? token : null;
112
+ }
113
+ /**
114
+ * Tier 3: Try config file
115
+ */
116
+ async function tryConfigFile() {
117
+ try {
118
+ const configPath = path_1.default.join(process.cwd(), '.csvibe', 'config.yml');
119
+ if (!(await fs_extra_1.default.pathExists(configPath))) {
120
+ return null;
121
+ }
122
+ const configContent = await fs_extra_1.default.readFile(configPath, 'utf-8');
123
+ const config = yaml_1.default.parse(configContent);
124
+ const token = config?.github?.token || config?.github?.access_token;
125
+ return token && token.length > 0 ? token : null;
126
+ }
127
+ catch (error) {
128
+ return null;
129
+ }
130
+ }
131
+ /**
132
+ * Tier 4: Try OS keychain
133
+ */
134
+ async function tryKeychain() {
135
+ return await (0, keychain_1.readTokenFromKeychain)();
136
+ }
137
+ /**
138
+ * Tier 5: Prompt user for token
139
+ */
140
+ async function promptForToken() {
141
+ p.intro(chalk_1.default.bold.cyan('GitHub Authentication Required'));
142
+ p.note(chalk_1.default.gray('To create a GitHub Personal Access Token:\n' +
143
+ '1. Go to: ' +
144
+ chalk_1.default.cyan('https://github.com/settings/tokens/new') +
145
+ '\n' +
146
+ '2. Select scopes: ' +
147
+ chalk_1.default.yellow('repo, read:org') +
148
+ '\n' +
149
+ '3. Generate and copy the token'), chalk_1.default.bold('📝 Setup Instructions'));
150
+ const token = await p.password({
151
+ message: 'GitHub Personal Access Token',
152
+ validate: (value) => {
153
+ if (!value)
154
+ return 'Token is required';
155
+ if (value.length < 20) {
156
+ return 'Token seems too short. Please enter a valid GitHub token.';
157
+ }
158
+ },
159
+ });
160
+ if (p.isCancel(token)) {
161
+ return null;
162
+ }
163
+ return token;
164
+ }
165
+ /**
166
+ * Validate GitHub token by making a test API call
167
+ */
168
+ async function validateToken(token) {
169
+ try {
170
+ const response = await fetch('https://api.github.com/user', {
171
+ headers: {
172
+ Authorization: `Bearer ${token}`,
173
+ Accept: 'application/vnd.github+json',
174
+ 'X-GitHub-Api-Version': '2022-11-28',
175
+ },
176
+ });
177
+ return response.ok;
178
+ }
179
+ catch (error) {
180
+ return false;
181
+ }
182
+ }
183
+ /**
184
+ * Get authentication method description for logging
185
+ */
186
+ function getAuthMethodDescription(method) {
187
+ const descriptions = {
188
+ 'gh-cli': 'GitHub CLI (gh auth token)',
189
+ 'env-var': 'Environment variable (GITHUB_TOKEN/GH_TOKEN)',
190
+ config: 'Config file (.csvibe/config.yml)',
191
+ keychain: 'OS Keychain (secure storage)',
192
+ prompt: 'User prompt (saved to keychain)',
193
+ };
194
+ return descriptions[method] || 'Unknown';
195
+ }
196
+ //# sourceMappingURL=auth-api.js.map