bmad-method 4.37.0 → 4.39.0

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 (251) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +3 -3
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +3 -3
  3. package/.github/workflows/discord.yaml +11 -2
  4. package/.github/workflows/format-check.yaml +42 -0
  5. package/.github/workflows/manual-release.yaml +173 -0
  6. package/.husky/pre-commit +3 -0
  7. package/.vscode/settings.json +26 -1
  8. package/CHANGELOG.md +2 -23
  9. package/README.md +2 -0
  10. package/bmad-core/agent-teams/team-all.yaml +1 -1
  11. package/bmad-core/agents/analyst.md +16 -15
  12. package/bmad-core/agents/architect.md +11 -11
  13. package/bmad-core/agents/bmad-master.md +23 -22
  14. package/bmad-core/agents/bmad-orchestrator.md +13 -17
  15. package/bmad-core/agents/dev.md +14 -11
  16. package/bmad-core/agents/pm.md +15 -14
  17. package/bmad-core/agents/po.md +9 -8
  18. package/bmad-core/agents/qa.md +42 -22
  19. package/bmad-core/agents/sm.md +7 -6
  20. package/bmad-core/agents/ux-expert.md +6 -5
  21. package/bmad-core/core-config.yaml +2 -0
  22. package/bmad-core/data/bmad-kb.md +1 -1
  23. package/bmad-core/data/test-levels-framework.md +146 -0
  24. package/bmad-core/data/test-priorities-matrix.md +172 -0
  25. package/bmad-core/tasks/apply-qa-fixes.md +148 -0
  26. package/bmad-core/tasks/facilitate-brainstorming-session.md +1 -1
  27. package/bmad-core/tasks/nfr-assess.md +343 -0
  28. package/bmad-core/tasks/qa-gate.md +161 -0
  29. package/bmad-core/tasks/review-story.md +234 -74
  30. package/bmad-core/tasks/risk-profile.md +353 -0
  31. package/bmad-core/tasks/test-design.md +174 -0
  32. package/bmad-core/tasks/trace-requirements.md +264 -0
  33. package/bmad-core/templates/architecture-tmpl.yaml +49 -49
  34. package/bmad-core/templates/brainstorming-output-tmpl.yaml +5 -5
  35. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +31 -31
  36. package/bmad-core/templates/brownfield-prd-tmpl.yaml +13 -13
  37. package/bmad-core/templates/competitor-analysis-tmpl.yaml +19 -6
  38. package/bmad-core/templates/front-end-architecture-tmpl.yaml +21 -9
  39. package/bmad-core/templates/front-end-spec-tmpl.yaml +24 -24
  40. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +122 -104
  41. package/bmad-core/templates/market-research-tmpl.yaml +2 -2
  42. package/bmad-core/templates/prd-tmpl.yaml +9 -9
  43. package/bmad-core/templates/project-brief-tmpl.yaml +4 -4
  44. package/bmad-core/templates/qa-gate-tmpl.yaml +102 -0
  45. package/bmad-core/templates/story-tmpl.yaml +12 -12
  46. package/bmad-core/workflows/brownfield-fullstack.yaml +9 -9
  47. package/bmad-core/workflows/brownfield-service.yaml +1 -1
  48. package/bmad-core/workflows/brownfield-ui.yaml +1 -1
  49. package/bmad-core/workflows/greenfield-fullstack.yaml +1 -1
  50. package/bmad-core/workflows/greenfield-service.yaml +1 -1
  51. package/bmad-core/workflows/greenfield-ui.yaml +1 -1
  52. package/common/utils/bmad-doc-template.md +5 -5
  53. package/dist/agents/analyst.txt +1086 -1079
  54. package/dist/agents/architect.txt +1534 -1526
  55. package/dist/agents/bmad-master.txt +646 -632
  56. package/dist/agents/bmad-orchestrator.txt +40 -18
  57. package/dist/agents/dev.txt +158 -19
  58. package/dist/agents/pm.txt +1082 -1107
  59. package/dist/agents/po.txt +314 -332
  60. package/dist/agents/qa.txt +1754 -151
  61. package/dist/agents/sm.txt +88 -98
  62. package/dist/agents/ux-expert.txt +80 -87
  63. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +109 -146
  64. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +75 -86
  65. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +41 -48
  66. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +1903 -1941
  67. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +15 -50
  68. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +149 -195
  69. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -15
  70. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +20 -37
  71. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +2660 -2752
  72. package/dist/expansion-packs/bmad-creative-writing/agents/beta-reader.txt +871 -0
  73. package/dist/expansion-packs/bmad-creative-writing/agents/book-critic.txt +78 -0
  74. package/dist/expansion-packs/bmad-creative-writing/agents/character-psychologist.txt +839 -0
  75. package/dist/expansion-packs/bmad-creative-writing/agents/cover-designer.txt +85 -0
  76. package/dist/expansion-packs/bmad-creative-writing/agents/dialog-specialist.txt +861 -0
  77. package/dist/expansion-packs/bmad-creative-writing/agents/editor.txt +796 -0
  78. package/dist/expansion-packs/bmad-creative-writing/agents/genre-specialist.txt +927 -0
  79. package/dist/expansion-packs/bmad-creative-writing/agents/narrative-designer.txt +842 -0
  80. package/dist/expansion-packs/bmad-creative-writing/agents/plot-architect.txt +1126 -0
  81. package/dist/expansion-packs/bmad-creative-writing/agents/world-builder.txt +864 -0
  82. package/dist/expansion-packs/bmad-creative-writing/teams/agent-team.txt +5917 -0
  83. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +25 -27
  84. package/dist/teams/team-all.txt +5541 -3768
  85. package/dist/teams/team-fullstack.txt +3014 -2987
  86. package/dist/teams/team-ide-minimal.txt +2219 -469
  87. package/dist/teams/team-no-ui.txt +2993 -2966
  88. package/docs/enhanced-ide-development-workflow.md +220 -15
  89. package/docs/user-guide.md +271 -18
  90. package/docs/versioning-and-releases.md +122 -44
  91. package/docs/working-in-the-brownfield.md +264 -31
  92. package/eslint.config.mjs +119 -0
  93. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +4 -4
  94. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +1 -1
  95. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +1 -1
  96. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +26 -28
  97. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +50 -50
  98. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +23 -23
  99. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +24 -24
  100. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +42 -42
  101. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +65 -65
  102. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +5 -5
  103. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +1 -1
  104. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +3 -3
  105. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +1 -1
  106. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +1 -1
  107. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +23 -23
  108. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +63 -63
  109. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +20 -20
  110. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +65 -65
  111. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +5 -5
  112. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +1 -1
  113. package/expansion-packs/bmad-creative-writing/README.md +132 -0
  114. package/expansion-packs/bmad-creative-writing/agent-teams/agent-team.yaml +19 -0
  115. package/expansion-packs/bmad-creative-writing/agents/beta-reader.md +91 -0
  116. package/expansion-packs/bmad-creative-writing/agents/book-critic.md +35 -0
  117. package/expansion-packs/bmad-creative-writing/agents/character-psychologist.md +90 -0
  118. package/expansion-packs/bmad-creative-writing/agents/cover-designer.md +41 -0
  119. package/expansion-packs/bmad-creative-writing/agents/dialog-specialist.md +89 -0
  120. package/expansion-packs/bmad-creative-writing/agents/editor.md +90 -0
  121. package/expansion-packs/bmad-creative-writing/agents/genre-specialist.md +92 -0
  122. package/expansion-packs/bmad-creative-writing/agents/narrative-designer.md +90 -0
  123. package/expansion-packs/bmad-creative-writing/agents/plot-architect.md +92 -0
  124. package/expansion-packs/bmad-creative-writing/agents/world-builder.md +91 -0
  125. package/expansion-packs/bmad-creative-writing/checklists/beta-feedback-closure-checklist.md +16 -0
  126. package/expansion-packs/bmad-creative-writing/checklists/character-consistency-checklist.md +16 -0
  127. package/expansion-packs/bmad-creative-writing/checklists/comedic-timing-checklist.md +16 -0
  128. package/expansion-packs/bmad-creative-writing/checklists/cyberpunk-aesthetic-checklist.md +16 -0
  129. package/expansion-packs/bmad-creative-writing/checklists/ebook-formatting-checklist.md +15 -0
  130. package/expansion-packs/bmad-creative-writing/checklists/epic-poetry-meter-checklist.md +16 -0
  131. package/expansion-packs/bmad-creative-writing/checklists/fantasy-magic-system-checklist.md +16 -0
  132. package/expansion-packs/bmad-creative-writing/checklists/foreshadowing-payoff-checklist.md +15 -0
  133. package/expansion-packs/bmad-creative-writing/checklists/genre-tropes-checklist.md +15 -0
  134. package/expansion-packs/bmad-creative-writing/checklists/historical-accuracy-checklist.md +16 -0
  135. package/expansion-packs/bmad-creative-writing/checklists/horror-suspense-checklist.md +16 -0
  136. package/expansion-packs/bmad-creative-writing/checklists/kdp-cover-ready-checklist.md +18 -0
  137. package/expansion-packs/bmad-creative-writing/checklists/line-edit-quality-checklist.md +16 -0
  138. package/expansion-packs/bmad-creative-writing/checklists/marketing-copy-checklist.md +16 -0
  139. package/expansion-packs/bmad-creative-writing/checklists/mystery-clue-trail-checklist.md +16 -0
  140. package/expansion-packs/bmad-creative-writing/checklists/orbital-mechanics-checklist.md +16 -0
  141. package/expansion-packs/bmad-creative-writing/checklists/plot-structure-checklist.md +49 -0
  142. package/expansion-packs/bmad-creative-writing/checklists/publication-readiness-checklist.md +16 -0
  143. package/expansion-packs/bmad-creative-writing/checklists/romance-emotional-beats-checklist.md +16 -0
  144. package/expansion-packs/bmad-creative-writing/checklists/scene-quality-checklist.md +16 -0
  145. package/expansion-packs/bmad-creative-writing/checklists/scifi-technology-plausibility-checklist.md +15 -0
  146. package/expansion-packs/bmad-creative-writing/checklists/sensitivity-representation-checklist.md +16 -0
  147. package/expansion-packs/bmad-creative-writing/checklists/steampunk-gadget-checklist.md +16 -0
  148. package/expansion-packs/bmad-creative-writing/checklists/thriller-pacing-stakes-checklist.md +16 -0
  149. package/expansion-packs/bmad-creative-writing/checklists/timeline-continuity-checklist.md +16 -0
  150. package/expansion-packs/bmad-creative-writing/checklists/world-building-continuity-checklist.md +16 -0
  151. package/expansion-packs/bmad-creative-writing/checklists/ya-appropriateness-checklist.md +16 -0
  152. package/expansion-packs/bmad-creative-writing/config.yaml +11 -0
  153. package/expansion-packs/bmad-creative-writing/data/bmad-kb.md +197 -0
  154. package/expansion-packs/bmad-creative-writing/data/story-structures.md +58 -0
  155. package/expansion-packs/bmad-creative-writing/docs/brief.md +183 -0
  156. package/expansion-packs/bmad-creative-writing/tasks/advanced-elicitation.md +117 -0
  157. package/expansion-packs/bmad-creative-writing/tasks/analyze-reader-feedback.md +16 -0
  158. package/expansion-packs/bmad-creative-writing/tasks/analyze-story-structure.md +55 -0
  159. package/expansion-packs/bmad-creative-writing/tasks/assemble-kdp-package.md +22 -0
  160. package/expansion-packs/bmad-creative-writing/tasks/brainstorm-premise.md +16 -0
  161. package/expansion-packs/bmad-creative-writing/tasks/build-world.md +17 -0
  162. package/expansion-packs/bmad-creative-writing/tasks/character-depth-pass.md +15 -0
  163. package/expansion-packs/bmad-creative-writing/tasks/create-doc.md +101 -0
  164. package/expansion-packs/bmad-creative-writing/tasks/create-draft-section.md +19 -0
  165. package/expansion-packs/bmad-creative-writing/tasks/critical-review.md +19 -0
  166. package/expansion-packs/bmad-creative-writing/tasks/develop-character.md +17 -0
  167. package/expansion-packs/bmad-creative-writing/tasks/execute-checklist.md +93 -0
  168. package/expansion-packs/bmad-creative-writing/tasks/expand-premise.md +16 -0
  169. package/expansion-packs/bmad-creative-writing/tasks/expand-synopsis.md +16 -0
  170. package/expansion-packs/bmad-creative-writing/tasks/final-polish.md +16 -0
  171. package/expansion-packs/bmad-creative-writing/tasks/generate-cover-brief.md +18 -0
  172. package/expansion-packs/bmad-creative-writing/tasks/generate-cover-prompts.md +19 -0
  173. package/expansion-packs/bmad-creative-writing/tasks/generate-scene-list.md +16 -0
  174. package/expansion-packs/bmad-creative-writing/tasks/incorporate-feedback.md +18 -0
  175. package/expansion-packs/bmad-creative-writing/tasks/outline-scenes.md +16 -0
  176. package/expansion-packs/bmad-creative-writing/tasks/provide-feedback.md +17 -0
  177. package/expansion-packs/bmad-creative-writing/tasks/publish-chapter.md +16 -0
  178. package/expansion-packs/bmad-creative-writing/tasks/quick-feedback.md +15 -0
  179. package/expansion-packs/bmad-creative-writing/tasks/select-next-arc.md +16 -0
  180. package/expansion-packs/bmad-creative-writing/tasks/workshop-dialog.md +51 -0
  181. package/expansion-packs/bmad-creative-writing/templates/beta-feedback-form.yaml +96 -0
  182. package/expansion-packs/bmad-creative-writing/templates/chapter-draft-tmpl.yaml +81 -0
  183. package/expansion-packs/bmad-creative-writing/templates/character-profile-tmpl.yaml +92 -0
  184. package/expansion-packs/bmad-creative-writing/templates/cover-design-brief-tmpl.yaml +97 -0
  185. package/expansion-packs/bmad-creative-writing/templates/premise-brief-tmpl.yaml +77 -0
  186. package/expansion-packs/bmad-creative-writing/templates/scene-list-tmpl.yaml +54 -0
  187. package/expansion-packs/bmad-creative-writing/templates/story-outline-tmpl.yaml +96 -0
  188. package/expansion-packs/bmad-creative-writing/templates/world-guide-tmpl.yaml +88 -0
  189. package/expansion-packs/bmad-creative-writing/workflows/book-cover-design-workflow.md +176 -0
  190. package/expansion-packs/bmad-creative-writing/workflows/novel-greenfield-workflow.yaml +58 -0
  191. package/expansion-packs/bmad-creative-writing/workflows/novel-serial-workflow.yaml +51 -0
  192. package/expansion-packs/bmad-creative-writing/workflows/novel-snowflake-workflow.yaml +69 -0
  193. package/expansion-packs/bmad-creative-writing/workflows/novel-writing.yaml +92 -0
  194. package/expansion-packs/bmad-creative-writing/workflows/screenplay-development.yaml +86 -0
  195. package/expansion-packs/bmad-creative-writing/workflows/series-planning.yaml +79 -0
  196. package/expansion-packs/bmad-creative-writing/workflows/short-story-creation.yaml +65 -0
  197. package/expansion-packs/bmad-infrastructure-devops/config.yaml +1 -1
  198. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +20 -20
  199. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +7 -7
  200. package/package.json +62 -39
  201. package/prettier.config.mjs +32 -0
  202. package/sync-version.sh +23 -0
  203. package/tools/bmad-npx-wrapper.js +10 -10
  204. package/tools/builders/web-builder.js +124 -130
  205. package/tools/bump-all-versions.js +42 -33
  206. package/tools/bump-expansion-version.js +23 -16
  207. package/tools/cli.js +10 -12
  208. package/tools/flattener/aggregate.js +10 -10
  209. package/tools/flattener/binary.js +44 -17
  210. package/tools/flattener/discovery.js +19 -18
  211. package/tools/flattener/files.js +6 -6
  212. package/tools/flattener/ignoreRules.js +125 -125
  213. package/tools/flattener/main.js +426 -70
  214. package/tools/flattener/projectRoot.js +186 -25
  215. package/tools/flattener/prompts.js +9 -9
  216. package/tools/flattener/stats.helpers.js +395 -0
  217. package/tools/flattener/stats.js +64 -14
  218. package/tools/flattener/test-matrix.js +413 -0
  219. package/tools/flattener/xml.js +33 -31
  220. package/tools/installer/bin/bmad.js +156 -113
  221. package/tools/installer/config/ide-agent-config.yaml +1 -1
  222. package/tools/installer/config/install.config.yaml +13 -3
  223. package/tools/installer/lib/config-loader.js +46 -42
  224. package/tools/installer/lib/file-manager.js +91 -113
  225. package/tools/installer/lib/ide-base-setup.js +57 -56
  226. package/tools/installer/lib/ide-setup.js +545 -399
  227. package/tools/installer/lib/installer.js +875 -714
  228. package/tools/installer/lib/memory-profiler.js +54 -53
  229. package/tools/installer/lib/module-manager.js +19 -15
  230. package/tools/installer/lib/resource-locator.js +26 -28
  231. package/tools/installer/package.json +19 -19
  232. package/tools/lib/dependency-resolver.js +26 -30
  233. package/tools/lib/yaml-utils.js +7 -7
  234. package/tools/preview-release-notes.js +66 -0
  235. package/tools/shared/bannerArt.js +3 -3
  236. package/tools/sync-installer-version.js +7 -9
  237. package/tools/update-expansion-version.js +14 -15
  238. package/tools/upgraders/v3-to-v4-upgrader.js +203 -294
  239. package/tools/version-bump.js +41 -26
  240. package/tools/yaml-format.js +56 -43
  241. package/.github/workflows/release.yaml +0 -60
  242. package/.releaserc.json +0 -21
  243. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
  244. 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
  245. 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
  246. 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
  247. 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
  248. 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
  249. 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
  250. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
  251. package/tools/semantic-release-sync-installer.js +0 -30
@@ -1,8 +1,6 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const { execSync } = require('child_process');
5
- const path = require('path');
1
+ const fs = require('node:fs');
2
+ const { execSync } = require('node:child_process');
3
+ const path = require('node:path');
6
4
 
7
5
  // Dynamic import for ES module
8
6
  let chalk;
@@ -26,54 +24,71 @@ function getCurrentVersion() {
26
24
 
27
25
  async function bumpVersion(type = 'patch') {
28
26
  await initializeModules();
29
-
27
+
30
28
  const validTypes = ['patch', 'minor', 'major'];
31
29
  if (!validTypes.includes(type)) {
32
30
  console.error(chalk.red(`Invalid version type: ${type}. Use: ${validTypes.join(', ')}`));
33
31
  process.exit(1);
34
32
  }
35
33
 
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;
34
+ const currentVersion = getCurrentVersion();
35
+ const versionParts = currentVersion.split('.').map(Number);
36
+ let newVersion;
37
+
38
+ switch (type) {
39
+ case 'major': {
40
+ newVersion = `${versionParts[0] + 1}.0.0`;
41
+ break;
42
+ }
43
+ case 'minor': {
44
+ newVersion = `${versionParts[0]}.${versionParts[1] + 1}.0`;
45
+ break;
46
+ }
47
+ case 'patch': {
48
+ newVersion = `${versionParts[0]}.${versionParts[1]}.${versionParts[2] + 1}`;
49
+ break;
50
+ }
51
+ }
52
+
53
+ console.log(chalk.blue(`Bumping version: ${currentVersion} → ${newVersion}`));
54
+
55
+ // Update package.json
56
+ const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));
57
+ packageJson.version = newVersion;
58
+ fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2) + '\n');
59
+
60
+ console.log(chalk.green(`✓ Updated package.json to ${newVersion}`));
61
+
62
+ return newVersion;
48
63
  }
49
64
 
50
65
  async function main() {
51
66
  await initializeModules();
52
-
67
+
53
68
  const type = process.argv[2] || 'patch';
54
69
  const currentVersion = getCurrentVersion();
55
-
70
+
56
71
  console.log(chalk.blue(`Current version: ${currentVersion}`));
57
-
72
+
58
73
  // Check if working directory is clean
59
74
  try {
60
75
  execSync('git diff-index --quiet HEAD --');
61
- } catch (error) {
76
+ } catch {
62
77
  console.error(chalk.red('❌ Working directory is not clean. Commit your changes first.'));
63
78
  process.exit(1);
64
79
  }
65
-
80
+
66
81
  const newVersion = await bumpVersion(type);
67
-
82
+
68
83
  console.log(chalk.green(`\n🎉 Version bump complete!`));
69
84
  console.log(chalk.blue(`📦 ${currentVersion} → ${newVersion}`));
70
85
  }
71
86
 
72
87
  if (require.main === module) {
73
- main().catch(error => {
88
+ main().catch((error) => {
74
89
  console.error('Error:', error);
75
90
  process.exit(1);
76
91
  });
77
92
  }
78
93
 
79
- module.exports = { bumpVersion, getCurrentVersion };
94
+ module.exports = { bumpVersion, getCurrentVersion };
@@ -1,9 +1,7 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const path = require('path');
1
+ const fs = require('node:fs');
2
+ const path = require('node:path');
5
3
  const yaml = require('js-yaml');
6
- const { execSync } = require('child_process');
4
+ const { execSync } = require('node:child_process');
7
5
 
8
6
  // Dynamic import for ES module
9
7
  let chalk;
@@ -26,43 +24,50 @@ async function formatYamlContent(content, filename) {
26
24
  // First try to fix common YAML issues
27
25
  let fixedContent = content
28
26
  // Fix "commands :" -> "commands:"
29
- .replace(/^(\s*)(\w+)\s+:/gm, '$1$2:')
27
+ .replaceAll(/^(\s*)(\w+)\s+:/gm, '$1$2:')
30
28
  // Fix inconsistent list indentation
31
- .replace(/^(\s*)-\s{3,}/gm, '$1- ');
32
-
29
+ .replaceAll(/^(\s*)-\s{3,}/gm, '$1- ');
30
+
33
31
  // Skip auto-fixing for .roomodes files - they have special nested structure
34
32
  if (!filename.includes('.roomodes')) {
35
33
  fixedContent = fixedContent
36
34
  // Fix unquoted list items that contain special characters or multiple parts
37
- .replace(/^(\s*)-\s+(.*)$/gm, (match, indent, content) => {
35
+ .replaceAll(/^(\s*)-\s+(.*)$/gm, (match, indent, content) => {
38
36
  // Skip if already quoted
39
37
  if (content.startsWith('"') && content.endsWith('"')) {
40
38
  return match;
41
39
  }
42
40
  // If the content contains special YAML characters or looks complex, quote it
43
41
  // 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/)) {
42
+ if (
43
+ (content.includes(':') ||
44
+ content.includes('-') ||
45
+ content.includes('{') ||
46
+ content.includes('}')) &&
47
+ !/^\w+:\s/.test(content)
48
+ ) {
46
49
  // Remove any existing quotes first, escape internal quotes, then add proper quotes
47
- const cleanContent = content.replace(/^["']|["']$/g, '').replace(/"/g, '\\"');
50
+ const cleanContent = content
51
+ .replaceAll(/^["']|["']$/g, '')
52
+ .replaceAll('"', String.raw`\"`);
48
53
  return `${indent}- "${cleanContent}"`;
49
54
  }
50
55
  return match;
51
56
  });
52
57
  }
53
-
58
+
54
59
  // Debug: show what we're trying to parse
55
60
  if (fixedContent !== content) {
56
61
  console.log(chalk.blue(`🔧 Applied YAML fixes to ${filename}`));
57
62
  }
58
-
63
+
59
64
  // Parse and re-dump YAML to format it
60
65
  const parsed = yaml.load(fixedContent);
61
66
  const formatted = yaml.dump(parsed, {
62
67
  indent: 2,
63
68
  lineWidth: -1, // Disable line wrapping
64
69
  noRefs: true,
65
- sortKeys: false // Preserve key order
70
+ sortKeys: false, // Preserve key order
66
71
  });
67
72
  return formatted;
68
73
  } catch (error) {
@@ -80,7 +85,7 @@ async function processMarkdownFile(filePath) {
80
85
 
81
86
  // Fix untyped code blocks by adding 'text' type
82
87
  // 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```');
88
+ newContent = newContent.replaceAll(/^```\n([\s\S]*?)\n```$/gm, '```text\n$1\n```');
84
89
  if (newContent !== content) {
85
90
  modified = true;
86
91
  console.log(chalk.blue(`🔧 Added 'text' type to untyped code blocks in ${filePath}`));
@@ -90,30 +95,30 @@ async function processMarkdownFile(filePath) {
90
95
  const yamlBlockRegex = /```ya?ml\n([\s\S]*?)\n```/g;
91
96
  let match;
92
97
  const replacements = [];
93
-
98
+
94
99
  while ((match = yamlBlockRegex.exec(newContent)) !== null) {
95
100
  const [fullMatch, yamlContent] = match;
96
101
  const formatted = await formatYamlContent(yamlContent, filePath);
97
102
  if (formatted !== null) {
98
103
  // Remove trailing newline that js-yaml adds
99
104
  const trimmedFormatted = formatted.replace(/\n$/, '');
100
-
105
+
101
106
  if (trimmedFormatted !== yamlContent) {
102
107
  modified = true;
103
108
  console.log(chalk.green(`✓ Formatted YAML in ${filePath}`));
104
109
  }
105
-
110
+
106
111
  replacements.push({
107
112
  start: match.index,
108
113
  end: match.index + fullMatch.length,
109
- replacement: `\`\`\`yaml\n${trimmedFormatted}\n\`\`\``
114
+ replacement: `\`\`\`yaml\n${trimmedFormatted}\n\`\`\``,
110
115
  });
111
116
  }
112
117
  }
113
-
118
+
114
119
  // 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];
120
+ for (let index = replacements.length - 1; index >= 0; index--) {
121
+ const { start, end, replacement } = replacements[index];
117
122
  newContent = newContent.slice(0, start) + replacement + newContent.slice(end);
118
123
  }
119
124
 
@@ -128,11 +133,11 @@ async function processYamlFile(filePath) {
128
133
  await initializeModules();
129
134
  const content = fs.readFileSync(filePath, 'utf8');
130
135
  const formatted = await formatYamlContent(content, filePath);
131
-
136
+
132
137
  if (formatted === null) {
133
138
  return false; // Syntax error
134
139
  }
135
-
140
+
136
141
  if (formatted !== content) {
137
142
  fs.writeFileSync(filePath, formatted);
138
143
  return true;
@@ -155,10 +160,10 @@ async function lintYamlFile(filePath) {
155
160
 
156
161
  async function main() {
157
162
  await initializeModules();
158
- const args = process.argv.slice(2);
163
+ const arguments_ = process.argv.slice(2);
159
164
  const glob = require('glob');
160
-
161
- if (args.length === 0) {
165
+
166
+ if (arguments_.length === 0) {
162
167
  console.error('Usage: node yaml-format.js <file1> [file2] ...');
163
168
  process.exit(1);
164
169
  }
@@ -169,38 +174,44 @@ async function main() {
169
174
 
170
175
  // Expand glob patterns and collect all files
171
176
  const allFiles = [];
172
- for (const arg of args) {
173
- if (arg.includes('*')) {
177
+ for (const argument of arguments_) {
178
+ if (argument.includes('*')) {
174
179
  // It's a glob pattern
175
- const matches = glob.sync(arg);
180
+ const matches = glob.sync(argument);
176
181
  allFiles.push(...matches);
177
182
  } else {
178
183
  // It's a direct file path
179
- allFiles.push(arg);
184
+ allFiles.push(argument);
180
185
  }
181
186
  }
182
187
 
183
188
  for (const filePath of allFiles) {
184
189
  if (!fs.existsSync(filePath)) {
185
190
  // Skip silently for glob patterns that don't match anything
186
- if (!args.some(arg => arg.includes('*') && filePath === arg)) {
191
+ if (!arguments_.some((argument) => argument.includes('*') && filePath === argument)) {
187
192
  console.error(chalk.red(`❌ File not found: ${filePath}`));
188
193
  hasErrors = true;
189
194
  }
190
195
  continue;
191
196
  }
192
197
 
193
- const ext = path.extname(filePath).toLowerCase();
198
+ const extension = path.extname(filePath).toLowerCase();
194
199
  const basename = path.basename(filePath).toLowerCase();
195
-
200
+
196
201
  try {
197
202
  let changed = false;
198
- if (ext === '.md') {
203
+ if (extension === '.md') {
199
204
  changed = await processMarkdownFile(filePath);
200
- } else if (ext === '.yaml' || ext === '.yml' || basename.includes('roomodes') || basename.includes('.yaml') || basename.includes('.yml')) {
205
+ } else if (
206
+ extension === '.yaml' ||
207
+ extension === '.yml' ||
208
+ basename.includes('roomodes') ||
209
+ basename.includes('.yaml') ||
210
+ basename.includes('.yml')
211
+ ) {
201
212
  // Handle YAML files and special cases like .roomodes
202
213
  changed = await processYamlFile(filePath);
203
-
214
+
204
215
  // Also run linting
205
216
  const lintPassed = await lintYamlFile(filePath);
206
217
  if (!lintPassed) hasErrors = true;
@@ -208,7 +219,7 @@ async function main() {
208
219
  // Skip silently for unsupported files
209
220
  continue;
210
221
  }
211
-
222
+
212
223
  if (changed) {
213
224
  hasChanges = true;
214
225
  filesProcessed.push(filePath);
@@ -220,8 +231,10 @@ async function main() {
220
231
  }
221
232
 
222
233
  if (hasChanges) {
223
- console.log(chalk.green(`\n✨ YAML formatting completed! Modified ${filesProcessed.length} files:`));
224
- filesProcessed.forEach(file => console.log(chalk.blue(` 📝 ${file}`)));
234
+ console.log(
235
+ chalk.green(`\n✨ YAML formatting completed! Modified ${filesProcessed.length} files:`),
236
+ );
237
+ for (const file of filesProcessed) console.log(chalk.blue(` 📝 ${file}`));
225
238
  }
226
239
 
227
240
  if (hasErrors) {
@@ -231,10 +244,10 @@ async function main() {
231
244
  }
232
245
 
233
246
  if (require.main === module) {
234
- main().catch(error => {
247
+ main().catch((error) => {
235
248
  console.error('Error:', error);
236
249
  process.exit(1);
237
250
  });
238
251
  }
239
252
 
240
- module.exports = { formatYamlContent, processMarkdownFile, processYamlFile };
253
+ module.exports = { formatYamlContent, processMarkdownFile, processYamlFile };
@@ -1,60 +0,0 @@
1
- name: Release
2
- 'on':
3
- push:
4
- branches:
5
- - main
6
- - stable
7
- workflow_dispatch:
8
- inputs:
9
- version_type:
10
- description: Version bump type
11
- required: true
12
- default: patch
13
- type: choice
14
- options:
15
- - patch
16
- - minor
17
- - major
18
- permissions:
19
- contents: write
20
- issues: write
21
- pull-requests: write
22
- packages: write
23
- jobs:
24
- release:
25
- runs-on: ubuntu-latest
26
- if: '!contains(github.event.head_commit.message, ''[skip ci]'')'
27
- steps:
28
- - name: Checkout
29
- uses: actions/checkout@v4
30
- with:
31
- fetch-depth: 0
32
- token: ${{ secrets.GITHUB_TOKEN }}
33
- - name: Setup Node.js
34
- uses: actions/setup-node@v4
35
- with:
36
- node-version: '20'
37
- cache: npm
38
- registry-url: https://registry.npmjs.org
39
- - name: Install dependencies
40
- run: npm ci
41
- - name: Run tests and validation
42
- run: |
43
- npm run validate
44
- npm run format
45
- - name: Debug permissions
46
- run: |
47
- echo "Testing git permissions..."
48
- git config user.name "github-actions[bot]"
49
- git config user.email "github-actions[bot]@users.noreply.github.com"
50
- echo "Git config set successfully"
51
- - name: Manual version bump
52
- if: github.event_name == 'workflow_dispatch'
53
- run: npm run version:${{ github.event.inputs.version_type }}
54
- - name: Semantic Release
55
- if: github.event_name == 'push'
56
- env:
57
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
58
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
59
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
60
- run: npm run release
package/.releaserc.json DELETED
@@ -1,21 +0,0 @@
1
- {
2
- "branches": [
3
- {
4
- "name": "main",
5
- "prerelease": "beta",
6
- "channel": "beta"
7
- },
8
- {
9
- "name": "stable",
10
- "channel": "latest"
11
- }
12
- ],
13
- "plugins": [
14
- "@semantic-release/commit-analyzer",
15
- "@semantic-release/release-notes-generator",
16
- "@semantic-release/changelog",
17
- "@semantic-release/npm",
18
- "./tools/semantic-release-sync-installer.js",
19
- "@semantic-release/github"
20
- ]
21
- }