bmad-method 4.37.0-beta.2 → 4.37.0-beta.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 (206) hide show
  1. package/README.md +3 -214
  2. package/package.json +26 -63
  3. package/.github/FUNDING.yaml +0 -15
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
  6. package/.github/workflows/discord.yaml +0 -16
  7. package/.github/workflows/release.yaml +0 -60
  8. package/.releaserc.json +0 -21
  9. package/.vscode/settings.json +0 -44
  10. package/CHANGELOG.md +0 -689
  11. package/CONTRIBUTING.md +0 -209
  12. package/LICENSE +0 -21
  13. package/bmad-core/agent-teams/team-all.yaml +0 -14
  14. package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
  15. package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
  16. package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
  17. package/bmad-core/agents/analyst.md +0 -81
  18. package/bmad-core/agents/architect.md +0 -84
  19. package/bmad-core/agents/bmad-master.md +0 -108
  20. package/bmad-core/agents/bmad-orchestrator.md +0 -150
  21. package/bmad-core/agents/dev.md +0 -76
  22. package/bmad-core/agents/pm.md +0 -81
  23. package/bmad-core/agents/po.md +0 -76
  24. package/bmad-core/agents/qa.md +0 -69
  25. package/bmad-core/agents/sm.md +0 -62
  26. package/bmad-core/agents/ux-expert.md +0 -66
  27. package/bmad-core/checklists/architect-checklist.md +0 -443
  28. package/bmad-core/checklists/change-checklist.md +0 -182
  29. package/bmad-core/checklists/pm-checklist.md +0 -375
  30. package/bmad-core/checklists/po-master-checklist.md +0 -441
  31. package/bmad-core/checklists/story-dod-checklist.md +0 -101
  32. package/bmad-core/checklists/story-draft-checklist.md +0 -156
  33. package/bmad-core/core-config.yaml +0 -20
  34. package/bmad-core/data/bmad-kb.md +0 -803
  35. package/bmad-core/data/brainstorming-techniques.md +0 -36
  36. package/bmad-core/data/elicitation-methods.md +0 -134
  37. package/bmad-core/data/technical-preferences.md +0 -3
  38. package/bmad-core/tasks/advanced-elicitation.md +0 -117
  39. package/bmad-core/tasks/brownfield-create-epic.md +0 -160
  40. package/bmad-core/tasks/brownfield-create-story.md +0 -147
  41. package/bmad-core/tasks/correct-course.md +0 -70
  42. package/bmad-core/tasks/create-brownfield-story.md +0 -304
  43. package/bmad-core/tasks/create-deep-research-prompt.md +0 -289
  44. package/bmad-core/tasks/create-next-story.md +0 -112
  45. package/bmad-core/tasks/document-project.md +0 -341
  46. package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
  47. package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
  48. package/bmad-core/tasks/index-docs.md +0 -179
  49. package/bmad-core/tasks/kb-mode-interaction.md +0 -75
  50. package/bmad-core/tasks/review-story.md +0 -145
  51. package/bmad-core/tasks/shard-doc.md +0 -187
  52. package/bmad-core/tasks/validate-next-story.md +0 -134
  53. package/bmad-core/templates/architecture-tmpl.yaml +0 -650
  54. package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
  55. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  56. package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
  57. package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -293
  58. package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -206
  59. package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
  60. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -805
  61. package/bmad-core/templates/market-research-tmpl.yaml +0 -252
  62. package/bmad-core/templates/prd-tmpl.yaml +0 -202
  63. package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
  64. package/bmad-core/templates/story-tmpl.yaml +0 -137
  65. package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
  66. package/bmad-core/workflows/brownfield-service.yaml +0 -187
  67. package/bmad-core/workflows/brownfield-ui.yaml +0 -197
  68. package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
  69. package/bmad-core/workflows/greenfield-service.yaml +0 -206
  70. package/bmad-core/workflows/greenfield-ui.yaml +0 -235
  71. package/common/tasks/create-doc.md +0 -101
  72. package/common/tasks/execute-checklist.md +0 -93
  73. package/common/utils/bmad-doc-template.md +0 -325
  74. package/common/utils/workflow-management.md +0 -69
  75. package/dist/agents/analyst.txt +0 -2882
  76. package/dist/agents/architect.txt +0 -3543
  77. package/dist/agents/bmad-master.txt +0 -8756
  78. package/dist/agents/bmad-orchestrator.txt +0 -1490
  79. package/dist/agents/dev.txt +0 -428
  80. package/dist/agents/pm.txt +0 -2229
  81. package/dist/agents/po.txt +0 -1364
  82. package/dist/agents/qa.txt +0 -386
  83. package/dist/agents/sm.txt +0 -668
  84. package/dist/agents/ux-expert.txt +0 -701
  85. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2408
  86. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1631
  87. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -822
  88. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10989
  89. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4047
  90. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3744
  91. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -465
  92. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -990
  93. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15467
  94. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2077
  95. package/dist/teams/team-all.txt +0 -11062
  96. package/dist/teams/team-fullstack.txt +0 -10392
  97. package/dist/teams/team-ide-minimal.txt +0 -3507
  98. package/dist/teams/team-no-ui.txt +0 -8951
  99. package/docs/GUIDING-PRINCIPLES.md +0 -91
  100. package/docs/core-architecture.md +0 -219
  101. package/docs/enhanced-ide-development-workflow.md +0 -43
  102. package/docs/expansion-packs.md +0 -280
  103. package/docs/how-to-contribute-with-pull-requests.md +0 -158
  104. package/docs/user-guide.md +0 -251
  105. package/docs/versioning-and-releases.md +0 -77
  106. package/docs/versions.md +0 -48
  107. package/docs/working-in-the-brownfield.md +0 -364
  108. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
  109. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash copy.txt +0 -13
  110. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash.txt +0 -13
  111. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.2 Agent Development Kit Installation/1.2.2 - Basic Project Structure - txt.txt +0 -25
  112. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.1 - settings.py +0 -34
  113. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.2 - main.py - Base Application.py +0 -70
  114. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.4 Deployment Configuration/1.4.2 - cloudbuild.yaml +0 -26
  115. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
  116. package/expansion-packs/README.md +0 -3
  117. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
  118. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
  119. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
  120. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
  121. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
  122. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
  123. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
  124. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -254
  125. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -651
  126. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -111
  127. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
  128. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -308
  129. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
  130. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
  131. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
  132. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
  133. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  134. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  135. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
  136. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
  137. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
  138. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
  139. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
  140. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
  141. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -396
  142. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
  143. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
  144. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -132
  145. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
  146. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -776
  147. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -590
  148. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -111
  149. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -151
  150. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
  151. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -308
  152. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
  153. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
  154. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
  155. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
  156. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
  157. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  158. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  159. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
  160. package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
  161. package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
  162. package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
  163. package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
  164. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -308
  165. package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -160
  166. package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -154
  167. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
  168. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
  169. package/tools/bmad-npx-wrapper.js +0 -39
  170. package/tools/builders/web-builder.js +0 -681
  171. package/tools/bump-all-versions.js +0 -106
  172. package/tools/bump-expansion-version.js +0 -83
  173. package/tools/cli.js +0 -154
  174. package/tools/flattener/aggregate.js +0 -76
  175. package/tools/flattener/binary.js +0 -53
  176. package/tools/flattener/discovery.js +0 -70
  177. package/tools/flattener/files.js +0 -35
  178. package/tools/flattener/ignoreRules.js +0 -176
  179. package/tools/flattener/main.js +0 -217
  180. package/tools/flattener/projectRoot.js +0 -45
  181. package/tools/flattener/prompts.js +0 -44
  182. package/tools/flattener/stats.js +0 -30
  183. package/tools/flattener/xml.js +0 -86
  184. package/tools/installer/README.md +0 -8
  185. package/tools/installer/package.json +0 -44
  186. package/tools/lib/dependency-resolver.js +0 -179
  187. package/tools/lib/yaml-utils.js +0 -29
  188. package/tools/md-assets/web-agent-startup-instructions.md +0 -39
  189. package/tools/semantic-release-sync-installer.js +0 -30
  190. package/tools/shared/bannerArt.js +0 -105
  191. package/tools/sync-installer-version.js +0 -34
  192. package/tools/update-expansion-version.js +0 -54
  193. package/tools/upgraders/v3-to-v4-upgrader.js +0 -763
  194. package/tools/version-bump.js +0 -79
  195. package/tools/yaml-format.js +0 -240
  196. /package/{tools/installer/bin → bin}/bmad.js +0 -0
  197. /package/{tools/installer/config → config}/ide-agent-config.yaml +0 -0
  198. /package/{tools/installer/config → config}/install.config.yaml +0 -0
  199. /package/{tools/installer/lib → lib}/config-loader.js +0 -0
  200. /package/{tools/installer/lib → lib}/file-manager.js +0 -0
  201. /package/{tools/installer/lib → lib}/ide-base-setup.js +0 -0
  202. /package/{tools/installer/lib → lib}/ide-setup.js +0 -0
  203. /package/{tools/installer/lib → lib}/installer.js +0 -0
  204. /package/{tools/installer/lib → lib}/memory-profiler.js +0 -0
  205. /package/{tools/installer/lib → lib}/module-manager.js +0 -0
  206. /package/{tools/installer/lib → lib}/resource-locator.js +0 -0
@@ -1,79 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const { execSync } = require('child_process');
5
- const path = require('path');
6
-
7
- // Dynamic import for ES module
8
- let chalk;
9
-
10
- // Initialize ES modules
11
- async function initializeModules() {
12
- if (!chalk) {
13
- chalk = (await import('chalk')).default;
14
- }
15
- }
16
-
17
- /**
18
- * Simple version bumping script for BMad-Method
19
- * Usage: node tools/version-bump.js [patch|minor|major]
20
- */
21
-
22
- function getCurrentVersion() {
23
- const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));
24
- return packageJson.version;
25
- }
26
-
27
- async function bumpVersion(type = 'patch') {
28
- await initializeModules();
29
-
30
- const validTypes = ['patch', 'minor', 'major'];
31
- if (!validTypes.includes(type)) {
32
- console.error(chalk.red(`Invalid version type: ${type}. Use: ${validTypes.join(', ')}`));
33
- process.exit(1);
34
- }
35
-
36
- console.log(chalk.yellow('⚠️ Manual version bumping is disabled.'));
37
- console.log(chalk.blue('🤖 This project uses semantic-release for automated versioning.'));
38
- console.log('');
39
- console.log(chalk.bold('To create a new release, use conventional commits:'));
40
- console.log(chalk.cyan(' feat: new feature (minor version bump)'));
41
- console.log(chalk.cyan(' fix: bug fix (patch version bump)'));
42
- console.log(chalk.cyan(' feat!: breaking change (major version bump)'));
43
- console.log('');
44
- console.log(chalk.dim('Example: git commit -m "feat: add new installer features"'));
45
- console.log(chalk.dim('Then push to main branch to trigger automatic release.'));
46
-
47
- return null;
48
- }
49
-
50
- async function main() {
51
- await initializeModules();
52
-
53
- const type = process.argv[2] || 'patch';
54
- const currentVersion = getCurrentVersion();
55
-
56
- console.log(chalk.blue(`Current version: ${currentVersion}`));
57
-
58
- // Check if working directory is clean
59
- try {
60
- execSync('git diff-index --quiet HEAD --');
61
- } catch (error) {
62
- console.error(chalk.red('❌ Working directory is not clean. Commit your changes first.'));
63
- process.exit(1);
64
- }
65
-
66
- const newVersion = await bumpVersion(type);
67
-
68
- console.log(chalk.green(`\n🎉 Version bump complete!`));
69
- console.log(chalk.blue(`📦 ${currentVersion} → ${newVersion}`));
70
- }
71
-
72
- if (require.main === module) {
73
- main().catch(error => {
74
- console.error('Error:', error);
75
- process.exit(1);
76
- });
77
- }
78
-
79
- module.exports = { bumpVersion, getCurrentVersion };
@@ -1,240 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
- const yaml = require('js-yaml');
6
- const { execSync } = require('child_process');
7
-
8
- // Dynamic import for ES module
9
- let chalk;
10
-
11
- // Initialize ES modules
12
- async function initializeModules() {
13
- if (!chalk) {
14
- chalk = (await import('chalk')).default;
15
- }
16
- }
17
-
18
- /**
19
- * YAML Formatter and Linter for BMad-Method
20
- * Formats and validates YAML files and YAML embedded in Markdown
21
- */
22
-
23
- async function formatYamlContent(content, filename) {
24
- await initializeModules();
25
- try {
26
- // First try to fix common YAML issues
27
- let fixedContent = content
28
- // Fix "commands :" -> "commands:"
29
- .replace(/^(\s*)(\w+)\s+:/gm, '$1$2:')
30
- // Fix inconsistent list indentation
31
- .replace(/^(\s*)-\s{3,}/gm, '$1- ');
32
-
33
- // Skip auto-fixing for .roomodes files - they have special nested structure
34
- if (!filename.includes('.roomodes')) {
35
- fixedContent = fixedContent
36
- // Fix unquoted list items that contain special characters or multiple parts
37
- .replace(/^(\s*)-\s+(.*)$/gm, (match, indent, content) => {
38
- // Skip if already quoted
39
- if (content.startsWith('"') && content.endsWith('"')) {
40
- return match;
41
- }
42
- // If the content contains special YAML characters or looks complex, quote it
43
- // BUT skip if it looks like a proper YAML key-value pair (like "key: value")
44
- if ((content.includes(':') || content.includes('-') || content.includes('{') || content.includes('}')) &&
45
- !content.match(/^\w+:\s/)) {
46
- // Remove any existing quotes first, escape internal quotes, then add proper quotes
47
- const cleanContent = content.replace(/^["']|["']$/g, '').replace(/"/g, '\\"');
48
- return `${indent}- "${cleanContent}"`;
49
- }
50
- return match;
51
- });
52
- }
53
-
54
- // Debug: show what we're trying to parse
55
- if (fixedContent !== content) {
56
- console.log(chalk.blue(`🔧 Applied YAML fixes to ${filename}`));
57
- }
58
-
59
- // Parse and re-dump YAML to format it
60
- const parsed = yaml.load(fixedContent);
61
- const formatted = yaml.dump(parsed, {
62
- indent: 2,
63
- lineWidth: -1, // Disable line wrapping
64
- noRefs: true,
65
- sortKeys: false // Preserve key order
66
- });
67
- return formatted;
68
- } catch (error) {
69
- console.error(chalk.red(`❌ YAML syntax error in ${filename}:`), error.message);
70
- console.error(chalk.yellow(`💡 Try manually fixing the YAML structure first`));
71
- return null;
72
- }
73
- }
74
-
75
- async function processMarkdownFile(filePath) {
76
- await initializeModules();
77
- const content = fs.readFileSync(filePath, 'utf8');
78
- let modified = false;
79
- let newContent = content;
80
-
81
- // Fix untyped code blocks by adding 'text' type
82
- // Match ``` at start of line followed by newline, but only if it's an opening fence
83
- newContent = newContent.replace(/^```\n([\s\S]*?)\n```$/gm, '```text\n$1\n```');
84
- if (newContent !== content) {
85
- modified = true;
86
- console.log(chalk.blue(`🔧 Added 'text' type to untyped code blocks in ${filePath}`));
87
- }
88
-
89
- // Find YAML code blocks
90
- const yamlBlockRegex = /```ya?ml\n([\s\S]*?)\n```/g;
91
- let match;
92
- const replacements = [];
93
-
94
- while ((match = yamlBlockRegex.exec(newContent)) !== null) {
95
- const [fullMatch, yamlContent] = match;
96
- const formatted = await formatYamlContent(yamlContent, filePath);
97
- if (formatted !== null) {
98
- // Remove trailing newline that js-yaml adds
99
- const trimmedFormatted = formatted.replace(/\n$/, '');
100
-
101
- if (trimmedFormatted !== yamlContent) {
102
- modified = true;
103
- console.log(chalk.green(`✓ Formatted YAML in ${filePath}`));
104
- }
105
-
106
- replacements.push({
107
- start: match.index,
108
- end: match.index + fullMatch.length,
109
- replacement: `\`\`\`yaml\n${trimmedFormatted}\n\`\`\``
110
- });
111
- }
112
- }
113
-
114
- // Apply replacements in reverse order to maintain indices
115
- for (let i = replacements.length - 1; i >= 0; i--) {
116
- const { start, end, replacement } = replacements[i];
117
- newContent = newContent.slice(0, start) + replacement + newContent.slice(end);
118
- }
119
-
120
- if (modified) {
121
- fs.writeFileSync(filePath, newContent);
122
- return true;
123
- }
124
- return false;
125
- }
126
-
127
- async function processYamlFile(filePath) {
128
- await initializeModules();
129
- const content = fs.readFileSync(filePath, 'utf8');
130
- const formatted = await formatYamlContent(content, filePath);
131
-
132
- if (formatted === null) {
133
- return false; // Syntax error
134
- }
135
-
136
- if (formatted !== content) {
137
- fs.writeFileSync(filePath, formatted);
138
- return true;
139
- }
140
- return false;
141
- }
142
-
143
- async function lintYamlFile(filePath) {
144
- await initializeModules();
145
- try {
146
- // Use yaml-lint for additional validation
147
- execSync(`npx yaml-lint "${filePath}"`, { stdio: 'pipe' });
148
- return true;
149
- } catch (error) {
150
- console.error(chalk.red(`❌ YAML lint error in ${filePath}:`));
151
- console.error(error.stdout?.toString() || error.message);
152
- return false;
153
- }
154
- }
155
-
156
- async function main() {
157
- await initializeModules();
158
- const args = process.argv.slice(2);
159
- const glob = require('glob');
160
-
161
- if (args.length === 0) {
162
- console.error('Usage: node yaml-format.js <file1> [file2] ...');
163
- process.exit(1);
164
- }
165
-
166
- let hasErrors = false;
167
- let hasChanges = false;
168
- let filesProcessed = [];
169
-
170
- // Expand glob patterns and collect all files
171
- const allFiles = [];
172
- for (const arg of args) {
173
- if (arg.includes('*')) {
174
- // It's a glob pattern
175
- const matches = glob.sync(arg);
176
- allFiles.push(...matches);
177
- } else {
178
- // It's a direct file path
179
- allFiles.push(arg);
180
- }
181
- }
182
-
183
- for (const filePath of allFiles) {
184
- if (!fs.existsSync(filePath)) {
185
- // Skip silently for glob patterns that don't match anything
186
- if (!args.some(arg => arg.includes('*') && filePath === arg)) {
187
- console.error(chalk.red(`❌ File not found: ${filePath}`));
188
- hasErrors = true;
189
- }
190
- continue;
191
- }
192
-
193
- const ext = path.extname(filePath).toLowerCase();
194
- const basename = path.basename(filePath).toLowerCase();
195
-
196
- try {
197
- let changed = false;
198
- if (ext === '.md') {
199
- changed = await processMarkdownFile(filePath);
200
- } else if (ext === '.yaml' || ext === '.yml' || basename.includes('roomodes') || basename.includes('.yaml') || basename.includes('.yml')) {
201
- // Handle YAML files and special cases like .roomodes
202
- changed = await processYamlFile(filePath);
203
-
204
- // Also run linting
205
- const lintPassed = await lintYamlFile(filePath);
206
- if (!lintPassed) hasErrors = true;
207
- } else {
208
- // Skip silently for unsupported files
209
- continue;
210
- }
211
-
212
- if (changed) {
213
- hasChanges = true;
214
- filesProcessed.push(filePath);
215
- }
216
- } catch (error) {
217
- console.error(chalk.red(`❌ Error processing ${filePath}:`), error.message);
218
- hasErrors = true;
219
- }
220
- }
221
-
222
- if (hasChanges) {
223
- console.log(chalk.green(`\n✨ YAML formatting completed! Modified ${filesProcessed.length} files:`));
224
- filesProcessed.forEach(file => console.log(chalk.blue(` 📝 ${file}`)));
225
- }
226
-
227
- if (hasErrors) {
228
- console.error(chalk.red('\n💥 Some files had errors. Please fix them before committing.'));
229
- process.exit(1);
230
- }
231
- }
232
-
233
- if (require.main === module) {
234
- main().catch(error => {
235
- console.error('Error:', error);
236
- process.exit(1);
237
- });
238
- }
239
-
240
- module.exports = { formatYamlContent, processMarkdownFile, processYamlFile };
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes