bmad-method 4.37.0-beta.5 → 4.37.0-beta.6

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/.github/FUNDING.yaml +15 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  4. package/.github/workflows/discord.yaml +16 -0
  5. package/.github/workflows/release.yaml +60 -0
  6. package/.releaserc.json +21 -0
  7. package/.vscode/settings.json +44 -0
  8. package/CHANGELOG.md +689 -0
  9. package/CONTRIBUTING.md +209 -0
  10. package/LICENSE +21 -0
  11. package/README.md +214 -3
  12. package/bmad-core/agent-teams/team-all.yaml +14 -0
  13. package/bmad-core/agent-teams/team-fullstack.yaml +18 -0
  14. package/bmad-core/agent-teams/team-ide-minimal.yaml +10 -0
  15. package/bmad-core/agent-teams/team-no-ui.yaml +13 -0
  16. package/bmad-core/agents/analyst.md +81 -0
  17. package/bmad-core/agents/architect.md +84 -0
  18. package/bmad-core/agents/bmad-master.md +108 -0
  19. package/bmad-core/agents/bmad-orchestrator.md +150 -0
  20. package/bmad-core/agents/dev.md +76 -0
  21. package/bmad-core/agents/pm.md +81 -0
  22. package/bmad-core/agents/po.md +76 -0
  23. package/bmad-core/agents/qa.md +69 -0
  24. package/bmad-core/agents/sm.md +62 -0
  25. package/bmad-core/agents/ux-expert.md +66 -0
  26. package/bmad-core/checklists/architect-checklist.md +443 -0
  27. package/bmad-core/checklists/change-checklist.md +182 -0
  28. package/bmad-core/checklists/pm-checklist.md +375 -0
  29. package/bmad-core/checklists/po-master-checklist.md +441 -0
  30. package/bmad-core/checklists/story-dod-checklist.md +101 -0
  31. package/bmad-core/checklists/story-draft-checklist.md +156 -0
  32. package/bmad-core/core-config.yaml +20 -0
  33. package/bmad-core/data/bmad-kb.md +803 -0
  34. package/bmad-core/data/brainstorming-techniques.md +36 -0
  35. package/bmad-core/data/elicitation-methods.md +134 -0
  36. package/bmad-core/data/technical-preferences.md +3 -0
  37. package/bmad-core/tasks/advanced-elicitation.md +117 -0
  38. package/bmad-core/tasks/brownfield-create-epic.md +160 -0
  39. package/bmad-core/tasks/brownfield-create-story.md +147 -0
  40. package/bmad-core/tasks/correct-course.md +70 -0
  41. package/bmad-core/tasks/create-brownfield-story.md +304 -0
  42. package/bmad-core/tasks/create-deep-research-prompt.md +289 -0
  43. package/bmad-core/tasks/create-next-story.md +112 -0
  44. package/bmad-core/tasks/document-project.md +341 -0
  45. package/bmad-core/tasks/facilitate-brainstorming-session.md +136 -0
  46. package/bmad-core/tasks/generate-ai-frontend-prompt.md +51 -0
  47. package/bmad-core/tasks/index-docs.md +179 -0
  48. package/bmad-core/tasks/kb-mode-interaction.md +75 -0
  49. package/bmad-core/tasks/review-story.md +145 -0
  50. package/bmad-core/tasks/shard-doc.md +187 -0
  51. package/bmad-core/tasks/validate-next-story.md +134 -0
  52. package/bmad-core/templates/architecture-tmpl.yaml +650 -0
  53. package/bmad-core/templates/brainstorming-output-tmpl.yaml +156 -0
  54. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +476 -0
  55. package/bmad-core/templates/brownfield-prd-tmpl.yaml +280 -0
  56. package/bmad-core/templates/competitor-analysis-tmpl.yaml +293 -0
  57. package/bmad-core/templates/front-end-architecture-tmpl.yaml +206 -0
  58. package/bmad-core/templates/front-end-spec-tmpl.yaml +349 -0
  59. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +805 -0
  60. package/bmad-core/templates/market-research-tmpl.yaml +252 -0
  61. package/bmad-core/templates/prd-tmpl.yaml +202 -0
  62. package/bmad-core/templates/project-brief-tmpl.yaml +221 -0
  63. package/bmad-core/templates/story-tmpl.yaml +137 -0
  64. package/bmad-core/workflows/brownfield-fullstack.yaml +297 -0
  65. package/bmad-core/workflows/brownfield-service.yaml +187 -0
  66. package/bmad-core/workflows/brownfield-ui.yaml +197 -0
  67. package/bmad-core/workflows/greenfield-fullstack.yaml +240 -0
  68. package/bmad-core/workflows/greenfield-service.yaml +206 -0
  69. package/bmad-core/workflows/greenfield-ui.yaml +235 -0
  70. package/common/tasks/create-doc.md +101 -0
  71. package/common/tasks/execute-checklist.md +93 -0
  72. package/common/utils/bmad-doc-template.md +325 -0
  73. package/common/utils/workflow-management.md +69 -0
  74. package/dist/agents/analyst.txt +2882 -0
  75. package/dist/agents/architect.txt +3543 -0
  76. package/dist/agents/bmad-master.txt +8756 -0
  77. package/dist/agents/bmad-orchestrator.txt +1490 -0
  78. package/dist/agents/dev.txt +428 -0
  79. package/dist/agents/pm.txt +2229 -0
  80. package/dist/agents/po.txt +1364 -0
  81. package/dist/agents/qa.txt +386 -0
  82. package/dist/agents/sm.txt +668 -0
  83. package/dist/agents/ux-expert.txt +701 -0
  84. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +2408 -0
  85. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +1631 -0
  86. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +822 -0
  87. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +10989 -0
  88. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +4047 -0
  89. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +3744 -0
  90. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +465 -0
  91. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +990 -0
  92. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +15467 -0
  93. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +2077 -0
  94. package/dist/teams/team-all.txt +11062 -0
  95. package/dist/teams/team-fullstack.txt +10392 -0
  96. package/dist/teams/team-ide-minimal.txt +3507 -0
  97. package/dist/teams/team-no-ui.txt +8951 -0
  98. package/docs/GUIDING-PRINCIPLES.md +91 -0
  99. package/docs/core-architecture.md +219 -0
  100. package/docs/enhanced-ide-development-workflow.md +43 -0
  101. package/docs/expansion-packs.md +280 -0
  102. package/docs/how-to-contribute-with-pull-requests.md +158 -0
  103. package/docs/user-guide.md +251 -0
  104. package/docs/versioning-and-releases.md +77 -0
  105. package/docs/versions.md +48 -0
  106. package/docs/working-in-the-brownfield.md +364 -0
  107. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +102 -0
  108. 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 +13 -0
  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.txt +13 -0
  110. 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 +25 -0
  111. 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 +34 -0
  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.2 - main.py - Base Application.py +70 -0
  113. 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 +26 -0
  114. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +109 -0
  115. package/expansion-packs/README.md +3 -0
  116. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +13 -0
  117. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +71 -0
  118. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +78 -0
  119. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +64 -0
  120. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +201 -0
  121. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +160 -0
  122. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +8 -0
  123. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +254 -0
  124. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +651 -0
  125. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +111 -0
  126. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +216 -0
  127. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +308 -0
  128. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +613 -0
  129. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +356 -0
  130. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +343 -0
  131. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +253 -0
  132. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +484 -0
  133. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +183 -0
  134. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +175 -0
  135. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +14 -0
  136. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +80 -0
  137. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +77 -0
  138. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +78 -0
  139. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +65 -0
  140. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +396 -0
  141. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +203 -0
  142. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +201 -0
  143. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +132 -0
  144. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +6 -0
  145. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +776 -0
  146. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +590 -0
  147. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +111 -0
  148. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +151 -0
  149. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +184 -0
  150. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +308 -0
  151. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +200 -0
  152. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +1030 -0
  153. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +356 -0
  154. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +705 -0
  155. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +256 -0
  156. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +484 -0
  157. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +183 -0
  158. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +175 -0
  159. package/expansion-packs/bmad-infrastructure-devops/README.md +147 -0
  160. package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +71 -0
  161. package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +484 -0
  162. package/expansion-packs/bmad-infrastructure-devops/config.yaml +9 -0
  163. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +308 -0
  164. package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +160 -0
  165. package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +154 -0
  166. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +424 -0
  167. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +629 -0
  168. package/package.json +62 -24
  169. package/tools/bmad-npx-wrapper.js +39 -0
  170. package/tools/builders/web-builder.js +681 -0
  171. package/tools/bump-all-versions.js +106 -0
  172. package/tools/bump-expansion-version.js +83 -0
  173. package/tools/cli.js +154 -0
  174. package/tools/flattener/aggregate.js +76 -0
  175. package/tools/flattener/binary.js +53 -0
  176. package/tools/flattener/discovery.js +70 -0
  177. package/tools/flattener/files.js +35 -0
  178. package/tools/flattener/ignoreRules.js +176 -0
  179. package/tools/flattener/main.js +217 -0
  180. package/tools/flattener/projectRoot.js +45 -0
  181. package/tools/flattener/prompts.js +44 -0
  182. package/tools/flattener/stats.js +30 -0
  183. package/tools/flattener/xml.js +86 -0
  184. package/tools/installer/README.md +8 -0
  185. package/tools/installer/package.json +44 -0
  186. package/tools/lib/dependency-resolver.js +179 -0
  187. package/tools/lib/yaml-utils.js +29 -0
  188. package/tools/md-assets/web-agent-startup-instructions.md +39 -0
  189. package/tools/semantic-release-sync-installer.js +30 -0
  190. package/tools/shared/bannerArt.js +105 -0
  191. package/tools/sync-installer-version.js +34 -0
  192. package/tools/update-expansion-version.js +54 -0
  193. package/tools/upgraders/v3-to-v4-upgrader.js +763 -0
  194. package/tools/version-bump.js +79 -0
  195. package/tools/yaml-format.js +240 -0
  196. /package/{bin → tools/installer/bin}/bmad.js +0 -0
  197. /package/{config → tools/installer/config}/ide-agent-config.yaml +0 -0
  198. /package/{config → tools/installer/config}/install.config.yaml +0 -0
  199. /package/{lib → tools/installer/lib}/config-loader.js +0 -0
  200. /package/{lib → tools/installer/lib}/file-manager.js +0 -0
  201. /package/{lib → tools/installer/lib}/ide-base-setup.js +0 -0
  202. /package/{lib → tools/installer/lib}/ide-setup.js +0 -0
  203. /package/{lib → tools/installer/lib}/installer.js +0 -0
  204. /package/{lib → tools/installer/lib}/memory-profiler.js +0 -0
  205. /package/{lib → tools/installer/lib}/module-manager.js +0 -0
  206. /package/{lib → tools/installer/lib}/resource-locator.js +0 -0
@@ -0,0 +1,79 @@
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 };
@@ -0,0 +1,240 @@
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