specweave 0.22.13 → 0.23.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 (312) hide show
  1. package/.claude-plugin/README.md +2 -2
  2. package/CLAUDE.md +447 -52
  3. package/README.md +33 -10
  4. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts +1 -1
  5. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +1 -1
  6. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js +1 -1
  7. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js.map +1 -1
  8. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
  9. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +4 -1
  10. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
  11. package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts +1 -1
  12. package/dist/plugins/specweave-github/lib/github-spec-sync.js +1 -1
  13. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.d.ts +9 -0
  14. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.d.ts.map +1 -1
  15. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js +10 -1
  16. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js.map +1 -1
  17. package/dist/plugins/specweave-github/lib/progress-comment-builder.js +2 -2
  18. package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -1
  19. package/dist/plugins/specweave-github/lib/types.d.ts +1 -1
  20. package/dist/src/cli/commands/import-external.d.ts +22 -0
  21. package/dist/src/cli/commands/import-external.d.ts.map +1 -0
  22. package/dist/src/cli/commands/import-external.js +282 -0
  23. package/dist/src/cli/commands/import-external.js.map +1 -0
  24. package/dist/src/cli/commands/init.d.ts.map +1 -1
  25. package/dist/src/cli/commands/init.js +359 -1
  26. package/dist/src/cli/commands/init.js.map +1 -1
  27. package/dist/src/cli/helpers/github-repo-selector.d.ts +59 -0
  28. package/dist/src/cli/helpers/github-repo-selector.d.ts.map +1 -0
  29. package/dist/src/cli/helpers/github-repo-selector.js +265 -0
  30. package/dist/src/cli/helpers/github-repo-selector.js.map +1 -0
  31. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  32. package/dist/src/cli/helpers/issue-tracker/index.js +41 -24
  33. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  34. package/dist/src/config/import-config.d.ts +69 -0
  35. package/dist/src/config/import-config.d.ts.map +1 -0
  36. package/dist/src/config/import-config.js +136 -0
  37. package/dist/src/config/import-config.js.map +1 -0
  38. package/dist/src/config/types.d.ts +26 -26
  39. package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
  40. package/dist/src/core/increment/ac-status-manager.js +4 -2
  41. package/dist/src/core/increment/ac-status-manager.js.map +1 -1
  42. package/dist/src/core/increment/completion-validator.d.ts +30 -1
  43. package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
  44. package/dist/src/core/increment/completion-validator.js +151 -3
  45. package/dist/src/core/increment/completion-validator.js.map +1 -1
  46. package/dist/src/core/increment/increment-archiver.d.ts +25 -0
  47. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  48. package/dist/src/core/increment/increment-archiver.js +130 -3
  49. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  50. package/dist/src/core/living-docs/feature-archiver.d.ts +37 -0
  51. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  52. package/dist/src/core/living-docs/feature-archiver.js +262 -18
  53. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  54. package/dist/src/core/living-docs/feature-id-manager.d.ts +17 -0
  55. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
  56. package/dist/src/core/living-docs/feature-id-manager.js +25 -0
  57. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  58. package/dist/src/core/living-docs/living-docs-sync.d.ts +16 -0
  59. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  60. package/dist/src/core/living-docs/living-docs-sync.js +56 -1
  61. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  62. package/dist/src/core/living-docs/task-project-specific-generator.d.ts +2 -2
  63. package/dist/src/core/living-docs/task-project-specific-generator.js +2 -2
  64. package/dist/src/core/repo-structure/prompt-consolidator.d.ts +2 -2
  65. package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
  66. package/dist/src/core/repo-structure/prompt-consolidator.js +3 -15
  67. package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
  68. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +1 -1
  69. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  70. package/dist/src/core/repo-structure/repo-structure-manager.js +3 -6
  71. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  72. package/dist/src/core/spec-content-sync.d.ts +4 -1
  73. package/dist/src/core/spec-content-sync.d.ts.map +1 -1
  74. package/dist/src/core/spec-content-sync.js +139 -4
  75. package/dist/src/core/spec-content-sync.js.map +1 -1
  76. package/dist/src/core/spec-task-mapper.d.ts.map +1 -1
  77. package/dist/src/core/spec-task-mapper.js +9 -8
  78. package/dist/src/core/spec-task-mapper.js.map +1 -1
  79. package/dist/src/core/status-line-validator.d.ts +63 -0
  80. package/dist/src/core/status-line-validator.d.ts.map +1 -0
  81. package/dist/src/core/status-line-validator.js +253 -0
  82. package/dist/src/core/status-line-validator.js.map +1 -0
  83. package/dist/src/core/sync/bidirectional-engine.d.ts +10 -1
  84. package/dist/src/core/sync/bidirectional-engine.d.ts.map +1 -1
  85. package/dist/src/core/sync/bidirectional-engine.js +10 -1
  86. package/dist/src/core/sync/bidirectional-engine.js.map +1 -1
  87. package/dist/src/core/sync/profile-manager.d.ts.map +1 -1
  88. package/dist/src/core/sync/profile-manager.js +3 -0
  89. package/dist/src/core/sync/profile-manager.js.map +1 -1
  90. package/dist/src/core/sync/project-context.d.ts.map +1 -1
  91. package/dist/src/core/sync/project-context.js +3 -0
  92. package/dist/src/core/sync/project-context.js.map +1 -1
  93. package/dist/src/core/sync/status-sync-engine.d.ts +1 -1
  94. package/dist/src/core/sync/status-sync-engine.js +1 -1
  95. package/dist/src/core/sync/sync-event-logger.d.ts +15 -1
  96. package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -1
  97. package/dist/src/core/sync/sync-event-logger.js +39 -1
  98. package/dist/src/core/sync/sync-event-logger.js.map +1 -1
  99. package/dist/src/core/types/origin-metadata.d.ts +153 -0
  100. package/dist/src/core/types/origin-metadata.d.ts.map +1 -0
  101. package/dist/src/core/types/origin-metadata.js +166 -0
  102. package/dist/src/core/types/origin-metadata.js.map +1 -0
  103. package/dist/src/core/types/sync-config-validator.d.ts +57 -0
  104. package/dist/src/core/types/sync-config-validator.d.ts.map +1 -0
  105. package/dist/src/core/types/sync-config-validator.js +116 -0
  106. package/dist/src/core/types/sync-config-validator.js.map +1 -0
  107. package/dist/src/core/types/sync-profile.d.ts +8 -2
  108. package/dist/src/core/types/sync-profile.d.ts.map +1 -1
  109. package/dist/src/core/types/sync-profile.js.map +1 -1
  110. package/dist/src/core/types/sync-settings.d.ts +73 -0
  111. package/dist/src/core/types/sync-settings.d.ts.map +1 -0
  112. package/dist/src/core/types/sync-settings.js +90 -0
  113. package/dist/src/core/types/sync-settings.js.map +1 -0
  114. package/dist/src/core/utils/permission-checker.d.ts +100 -0
  115. package/dist/src/core/utils/permission-checker.d.ts.map +1 -0
  116. package/dist/src/core/utils/permission-checker.js +166 -0
  117. package/dist/src/core/utils/permission-checker.js.map +1 -0
  118. package/dist/src/generators/spec/spec-parser.js +3 -3
  119. package/dist/src/generators/spec/spec-parser.js.map +1 -1
  120. package/dist/src/generators/spec/task-parser.js +4 -4
  121. package/dist/src/generators/spec/task-parser.js.map +1 -1
  122. package/dist/src/id-generators/task-id-generator.d.ts +96 -0
  123. package/dist/src/id-generators/task-id-generator.d.ts.map +1 -0
  124. package/dist/src/id-generators/task-id-generator.js +143 -0
  125. package/dist/src/id-generators/task-id-generator.js.map +1 -0
  126. package/dist/src/id-generators/us-id-generator.d.ts +96 -0
  127. package/dist/src/id-generators/us-id-generator.d.ts.map +1 -0
  128. package/dist/src/id-generators/us-id-generator.js +143 -0
  129. package/dist/src/id-generators/us-id-generator.js.map +1 -0
  130. package/dist/src/importers/ado-importer.d.ts +43 -0
  131. package/dist/src/importers/ado-importer.d.ts.map +1 -0
  132. package/dist/src/importers/ado-importer.js +234 -0
  133. package/dist/src/importers/ado-importer.js.map +1 -0
  134. package/dist/src/importers/duplicate-detector.d.ts +107 -0
  135. package/dist/src/importers/duplicate-detector.d.ts.map +1 -0
  136. package/dist/src/importers/duplicate-detector.js +189 -0
  137. package/dist/src/importers/duplicate-detector.js.map +1 -0
  138. package/dist/src/importers/external-importer.d.ts +96 -0
  139. package/dist/src/importers/external-importer.d.ts.map +1 -0
  140. package/dist/src/importers/external-importer.js +13 -0
  141. package/dist/src/importers/external-importer.js.map +1 -0
  142. package/dist/src/importers/github-importer.d.ts +37 -0
  143. package/dist/src/importers/github-importer.d.ts.map +1 -0
  144. package/dist/src/importers/github-importer.js +161 -0
  145. package/dist/src/importers/github-importer.js.map +1 -0
  146. package/dist/src/importers/import-coordinator.d.ts +105 -0
  147. package/dist/src/importers/import-coordinator.d.ts.map +1 -0
  148. package/dist/src/importers/import-coordinator.js +224 -0
  149. package/dist/src/importers/import-coordinator.js.map +1 -0
  150. package/dist/src/importers/item-converter.d.ts +96 -0
  151. package/dist/src/importers/item-converter.d.ts.map +1 -0
  152. package/dist/src/importers/item-converter.js +246 -0
  153. package/dist/src/importers/item-converter.js.map +1 -0
  154. package/dist/src/importers/jira-importer.d.ts +42 -0
  155. package/dist/src/importers/jira-importer.d.ts.map +1 -0
  156. package/dist/src/importers/jira-importer.js +221 -0
  157. package/dist/src/importers/jira-importer.js.map +1 -0
  158. package/dist/src/importers/rate-limiter.d.ts +128 -0
  159. package/dist/src/importers/rate-limiter.d.ts.map +1 -0
  160. package/dist/src/importers/rate-limiter.js +200 -0
  161. package/dist/src/importers/rate-limiter.js.map +1 -0
  162. package/dist/src/init/compliance/types.d.ts +2 -2
  163. package/dist/src/init/repo/types.d.ts +2 -2
  164. package/dist/src/integrations/ado/ado-client.d.ts +6 -0
  165. package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
  166. package/dist/src/integrations/ado/ado-client.js +23 -0
  167. package/dist/src/integrations/ado/ado-client.js.map +1 -1
  168. package/dist/src/integrations/jira/jira-client.d.ts +6 -0
  169. package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
  170. package/dist/src/integrations/jira/jira-client.js +38 -0
  171. package/dist/src/integrations/jira/jira-client.js.map +1 -1
  172. package/dist/src/integrations/jira/jira-mapper.d.ts +1 -1
  173. package/dist/src/integrations/jira/jira-mapper.js +1 -1
  174. package/dist/src/living-docs/fs-id-allocator.d.ts +149 -0
  175. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -0
  176. package/dist/src/living-docs/fs-id-allocator.js +325 -0
  177. package/dist/src/living-docs/fs-id-allocator.js.map +1 -0
  178. package/dist/src/living-docs/id-registry.d.ts +124 -0
  179. package/dist/src/living-docs/id-registry.d.ts.map +1 -0
  180. package/dist/src/living-docs/id-registry.js +230 -0
  181. package/dist/src/living-docs/id-registry.js.map +1 -0
  182. package/dist/src/progress/us-progress-tracker.d.ts +68 -0
  183. package/dist/src/progress/us-progress-tracker.d.ts.map +1 -0
  184. package/dist/src/progress/us-progress-tracker.js +120 -0
  185. package/dist/src/progress/us-progress-tracker.js.map +1 -0
  186. package/dist/src/sync/external-item-sync-service.d.ts +150 -0
  187. package/dist/src/sync/external-item-sync-service.d.ts.map +1 -0
  188. package/dist/src/sync/external-item-sync-service.js +241 -0
  189. package/dist/src/sync/external-item-sync-service.js.map +1 -0
  190. package/dist/src/sync/format-preservation-sync.d.ts +90 -0
  191. package/dist/src/sync/format-preservation-sync.d.ts.map +1 -0
  192. package/dist/src/sync/format-preservation-sync.js +173 -0
  193. package/dist/src/sync/format-preservation-sync.js.map +1 -0
  194. package/dist/src/sync/index.d.ts +8 -0
  195. package/dist/src/sync/index.d.ts.map +1 -0
  196. package/dist/src/sync/index.js +6 -0
  197. package/dist/src/sync/index.js.map +1 -0
  198. package/dist/src/sync/sync-coordinator.d.ts +49 -0
  199. package/dist/src/sync/sync-coordinator.d.ts.map +1 -0
  200. package/dist/src/sync/sync-coordinator.js +248 -0
  201. package/dist/src/sync/sync-coordinator.js.map +1 -0
  202. package/dist/src/sync/sync-metadata.d.ts +75 -0
  203. package/dist/src/sync/sync-metadata.d.ts.map +1 -0
  204. package/dist/src/sync/sync-metadata.js +100 -0
  205. package/dist/src/sync/sync-metadata.js.map +1 -0
  206. package/dist/src/types/living-docs-us-file.d.ts +63 -0
  207. package/dist/src/types/living-docs-us-file.d.ts.map +1 -0
  208. package/dist/src/types/living-docs-us-file.js +27 -0
  209. package/dist/src/types/living-docs-us-file.js.map +1 -0
  210. package/dist/src/validators/format-preservation-validator.d.ts +127 -0
  211. package/dist/src/validators/format-preservation-validator.d.ts.map +1 -0
  212. package/dist/src/validators/format-preservation-validator.js +187 -0
  213. package/dist/src/validators/format-preservation-validator.js.map +1 -0
  214. package/package.json +3 -2
  215. package/plugins/specweave/.claude-plugin/plugin.json +36 -2
  216. package/plugins/specweave/agents/architect/AGENT.md +11 -2
  217. package/plugins/specweave/agents/test-aware-planner/AGENT.md +81 -25
  218. package/plugins/specweave/commands/specweave-archive-features.md +11 -1
  219. package/plugins/specweave/commands/specweave-import-external.md +407 -0
  220. package/plugins/specweave/commands/specweave-progress.md +45 -97
  221. package/plugins/specweave/hooks/post-edit-spec.sh +41 -0
  222. package/plugins/specweave/hooks/post-increment-completion.sh +168 -26
  223. package/plugins/specweave/hooks/post-increment-planning.sh +148 -4
  224. package/plugins/specweave/hooks/post-spec-update.sh +0 -0
  225. package/plugins/specweave/hooks/post-task-completion.sh +75 -5
  226. package/plugins/specweave/hooks/post-write-spec.sh +37 -0
  227. package/plugins/specweave/lib/hooks/auto-transition.js +1 -1
  228. package/plugins/specweave/lib/hooks/auto-transition.ts +1 -1
  229. package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
  230. package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
  231. package/plugins/specweave/lib/hooks/sync-cache.js +294 -0
  232. package/plugins/specweave/lib/hooks/sync-living-docs.js +67 -2
  233. package/plugins/specweave/lib/hooks/sync-us-tasks.js +200 -14
  234. package/plugins/specweave/lib/hooks/translate-file.js +1 -1
  235. package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
  236. package/plugins/specweave/lib/hooks/update-ac-status.js +1 -1
  237. package/plugins/specweave/lib/hooks/update-ac-status.ts +1 -1
  238. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
  239. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +345 -0
  240. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
  241. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +106 -0
  242. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +220 -0
  243. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
  244. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +60 -0
  245. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +192 -0
  246. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
  247. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
  248. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +276 -0
  249. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
  250. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +163 -0
  251. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +541 -0
  252. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
  253. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +157 -0
  254. package/plugins/specweave/lib/vendor/core/types/increment-metadata.js +191 -0
  255. package/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
  256. package/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
  257. package/plugins/specweave/lib/vendor/generators/spec/task-parser.js +301 -0
  258. package/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
  259. package/plugins/specweave/lib/vendor/utils/logger.d.ts +48 -0
  260. package/plugins/specweave/lib/vendor/utils/logger.js +53 -0
  261. package/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
  262. package/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
  263. package/plugins/specweave/lib/vendor/utils/translation.js +414 -0
  264. package/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
  265. package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
  266. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
  267. package/plugins/specweave-ado/lib/conflict-resolver.ts +1 -1
  268. package/plugins/specweave-alternatives/.claude-plugin/plugin.json +1 -1
  269. package/plugins/specweave-backend/.claude-plugin/plugin.json +1 -1
  270. package/plugins/specweave-confluent/.claude-plugin/plugin.json +1 -1
  271. package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +1 -1
  272. package/plugins/specweave-diagrams/.claude-plugin/plugin.json +1 -1
  273. package/plugins/specweave-docs/.claude-plugin/plugin.json +1 -1
  274. package/plugins/specweave-docs-preview/.claude-plugin/plugin.json +1 -1
  275. package/plugins/specweave-figma/.claude-plugin/plugin.json +1 -1
  276. package/plugins/specweave-frontend/.claude-plugin/plugin.json +1 -1
  277. package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
  278. package/plugins/specweave-github/commands/specweave-github-update-user-story.md +1 -1
  279. package/plugins/specweave-github/hooks/post-task-completion.sh +37 -22
  280. package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +1 -1
  281. package/plugins/specweave-github/lib/enhanced-github-sync.js +1 -1
  282. package/plugins/specweave-github/lib/enhanced-github-sync.ts +1 -1
  283. package/plugins/specweave-github/lib/github-spec-content-sync.js +2 -1
  284. package/plugins/specweave-github/lib/github-spec-content-sync.ts +4 -1
  285. package/plugins/specweave-github/lib/github-spec-sync.js +1 -1
  286. package/plugins/specweave-github/lib/github-spec-sync.ts +1 -1
  287. package/plugins/specweave-github/lib/github-sync-bidirectional.js +1 -1
  288. package/plugins/specweave-github/lib/github-sync-bidirectional.ts +10 -1
  289. package/plugins/specweave-github/lib/progress-comment-builder.js +1 -1
  290. package/plugins/specweave-github/lib/progress-comment-builder.ts +2 -2
  291. package/plugins/specweave-github/lib/types.ts +1 -1
  292. package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +1 -1
  293. package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +1 -1
  294. package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
  295. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
  296. package/plugins/specweave-kafka/.claude-plugin/plugin.json +1 -1
  297. package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +1 -1
  298. package/plugins/specweave-kubernetes/.claude-plugin/plugin.json +1 -1
  299. package/plugins/specweave-ml/.claude-plugin/plugin.json +1 -1
  300. package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -1
  301. package/plugins/specweave-n8n/.claude-plugin/plugin.json +1 -1
  302. package/plugins/specweave-payments/.claude-plugin/plugin.json +1 -1
  303. package/plugins/specweave-release/.claude-plugin/plugin.json +1 -1
  304. package/plugins/specweave-testing/.claude-plugin/plugin.json +1 -1
  305. package/plugins/specweave-tooling/.claude-plugin/plugin.json +1 -1
  306. package/plugins/specweave-ui/.claude-plugin/plugin.json +1 -1
  307. package/src/templates/.env.example +5 -0
  308. package/src/templates/config-permissions-guide.md +413 -0
  309. package/src/templates/config.json.template +68 -0
  310. package/src/templates/tasks.md.template +180 -201
  311. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
  312. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -5442
@@ -0,0 +1,414 @@
1
+ /**
2
+ * Translation Utilities
3
+ *
4
+ * LLM-native translation system for SpecWeave multilingual support.
5
+ * Provides zero-cost language detection and cost-efficient translation
6
+ * using Claude Haiku via current LLM session.
7
+ *
8
+ * Strategy:
9
+ * - Language Detection: Simple heuristic (no API calls, <1ms)
10
+ * - Translation: Claude Haiku via current session (~$0.0025 per file)
11
+ * - Preservation: Markdown, code blocks, technical terms stay intact
12
+ *
13
+ * @see .specweave/increments/0006-llm-native-i18n/reports/DESIGN-POST-GENERATION-TRANSLATION.md
14
+ */
15
+ /**
16
+ * Language detection patterns (Unicode ranges for major scripts)
17
+ */
18
+ const LANGUAGE_PATTERNS = {
19
+ ru: /[а-яА-ЯёЁ]/, // Cyrillic (Russian)
20
+ zh: /[\u4e00-\u9fff]/, // Chinese characters (CJK Unified Ideographs)
21
+ ja: /[\u3040-\u309f\u30a0-\u30ff]/, // Hiragana + Katakana (Japanese)
22
+ ko: /[\uac00-\ud7af]/, // Hangul (Korean)
23
+ ar: /[\u0600-\u06ff]/, // Arabic
24
+ he: /[\u0590-\u05ff]/, // Hebrew
25
+ // Latin-based languages need context (Spanish, German, French, Portuguese)
26
+ // We'll use heuristics for these
27
+ };
28
+ /**
29
+ * Spanish-specific words/patterns
30
+ */
31
+ const SPANISH_INDICATORS = [
32
+ 'ción', 'sión', 'qué', 'cuál', 'español', 'también', 'año', 'señor'
33
+ ];
34
+ /**
35
+ * German-specific words/patterns
36
+ */
37
+ const GERMAN_INDICATORS = [
38
+ 'ß', 'ä', 'ö', 'ü', 'dass', 'ich', 'und', 'der', 'die', 'das'
39
+ ];
40
+ /**
41
+ * French-specific words/patterns
42
+ */
43
+ const FRENCH_INDICATORS = [
44
+ 'ç', 'où', 'être', 'français', 'avec', 'dans', 'pour', 'qui', 'que'
45
+ ];
46
+ /**
47
+ * Portuguese-specific words/patterns
48
+ */
49
+ const PORTUGUESE_INDICATORS = [
50
+ 'ção', 'português', 'também', 'não', 'com', 'para', 'seu', 'sua', 'documentação'
51
+ ];
52
+ /**
53
+ * Detects the language of the given content using simple heuristics
54
+ *
55
+ * @param content - The text content to analyze
56
+ * @returns Language detection result with confidence score
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const result = detectLanguage('Это тестовый документ');
61
+ * console.log(result.language); // 'ru'
62
+ * console.log(result.confidence); // 0.95
63
+ * ```
64
+ */
65
+ export function detectLanguage(content) {
66
+ // Calculate non-ASCII ratio
67
+ const nonAsciiChars = content.match(/[^\x00-\x7F]/g) || [];
68
+ const totalChars = content.length;
69
+ const nonAsciiRatio = totalChars > 0 ? nonAsciiChars.length / totalChars : 0;
70
+ // If <5% non-ASCII, likely English
71
+ if (nonAsciiRatio < 0.05) {
72
+ return {
73
+ language: 'en',
74
+ confidence: 0.95,
75
+ nonAsciiRatio,
76
+ detectionMethod: 'heuristic'
77
+ };
78
+ }
79
+ // Try to detect specific language
80
+ const detected = detectSpecificLanguage(content);
81
+ if (detected !== 'unknown') {
82
+ return {
83
+ language: detected,
84
+ confidence: 0.90,
85
+ nonAsciiRatio,
86
+ detectionMethod: 'heuristic'
87
+ };
88
+ }
89
+ // Fallback: unknown language
90
+ return {
91
+ language: 'unknown',
92
+ confidence: 0.5,
93
+ nonAsciiRatio,
94
+ detectionMethod: 'heuristic'
95
+ };
96
+ }
97
+ /**
98
+ * Detects specific language from content
99
+ *
100
+ * @param content - The text content to analyze
101
+ * @returns Detected language code or 'unknown'
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * detectSpecificLanguage('Это текст'); // 'ru'
106
+ * detectSpecificLanguage('这是文本'); // 'zh'
107
+ * ```
108
+ */
109
+ export function detectSpecificLanguage(content) {
110
+ // Test against Unicode ranges first (most reliable)
111
+ for (const [lang, pattern] of Object.entries(LANGUAGE_PATTERNS)) {
112
+ if (pattern.test(content)) {
113
+ return lang;
114
+ }
115
+ }
116
+ // For Latin-based languages, use indicator words
117
+ const lowerContent = content.toLowerCase();
118
+ // Spanish
119
+ if (SPANISH_INDICATORS.some(indicator => lowerContent.includes(indicator))) {
120
+ return 'es';
121
+ }
122
+ // Portuguese (check before French due to overlap in 'ção' and 'em')
123
+ if (PORTUGUESE_INDICATORS.some(indicator => lowerContent.includes(indicator))) {
124
+ return 'pt';
125
+ }
126
+ // German
127
+ if (GERMAN_INDICATORS.some(indicator => lowerContent.includes(indicator))) {
128
+ return 'de';
129
+ }
130
+ // French
131
+ if (FRENCH_INDICATORS.some(indicator => lowerContent.includes(indicator))) {
132
+ return 'fr';
133
+ }
134
+ return 'unknown';
135
+ }
136
+ /**
137
+ * Preserves code blocks, inline code, and links before translation
138
+ *
139
+ * @param content - Markdown content to preserve
140
+ * @returns Preserved content with placeholders
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * const content = 'Text\n```js\ncode\n```\nMore text';
145
+ * const preserved = preserveCodeBlocks(content);
146
+ * // preserved.blocks = ['```js\ncode\n```']
147
+ * // preserved.preserved = 'Text\n__CODE_BLOCK_0__\nMore text'
148
+ * ```
149
+ */
150
+ export function preserveCodeBlocks(content) {
151
+ const blocks = [];
152
+ const inlineCode = [];
153
+ const links = [];
154
+ // 1. Preserve fenced code blocks (```...```)
155
+ let preserved = content.replace(/```[\s\S]*?```/g, (match) => {
156
+ blocks.push(match);
157
+ return `__CODE_BLOCK_${blocks.length - 1}__`;
158
+ });
159
+ // 2. Preserve inline code (`...`)
160
+ preserved = preserved.replace(/`[^`]+`/g, (match) => {
161
+ inlineCode.push(match);
162
+ return `__INLINE_CODE_${inlineCode.length - 1}__`;
163
+ });
164
+ // 3. Preserve markdown links ([text](url))
165
+ preserved = preserved.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, text, url) => {
166
+ links.push(match);
167
+ return `__LINK_${links.length - 1}__`;
168
+ });
169
+ return {
170
+ preserved,
171
+ blocks,
172
+ inlineCode,
173
+ links
174
+ };
175
+ }
176
+ /**
177
+ * Restores preserved code blocks, inline code, and links after translation
178
+ *
179
+ * @param translated - Translated text with placeholders
180
+ * @param preserved - Preserved content structure
181
+ * @returns Restored text with original code blocks and links
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * const translated = 'Текст\n__CODE_BLOCK_0__\nБольше текста';
186
+ * const preserved = { blocks: ['```js\ncode\n```'], inlineCode: [], links: [] };
187
+ * const restored = restoreCodeBlocks(translated, preserved);
188
+ * // Result: 'Текст\n```js\ncode\n```\nБольше текста'
189
+ * ```
190
+ */
191
+ export function restoreCodeBlocks(translated, preserved) {
192
+ let restored = translated;
193
+ // Restore in reverse order of preservation (links → inline code → blocks)
194
+ // 1. Restore links
195
+ preserved.links.forEach((link, i) => {
196
+ restored = restored.replace(`__LINK_${i}__`, link);
197
+ });
198
+ // 2. Restore inline code
199
+ preserved.inlineCode.forEach((code, i) => {
200
+ restored = restored.replace(`__INLINE_CODE_${i}__`, code);
201
+ });
202
+ // 3. Restore code blocks
203
+ preserved.blocks.forEach((block, i) => {
204
+ restored = restored.replace(`__CODE_BLOCK_${i}__`, block);
205
+ });
206
+ return restored;
207
+ }
208
+ /**
209
+ * Estimates the number of tokens in a text
210
+ * Rule of thumb: ~4 characters per token for English, ~2-3 for other languages
211
+ *
212
+ * @param text - Text to estimate
213
+ * @param language - Language code for estimation
214
+ * @returns Estimated token count
215
+ */
216
+ export function estimateTokens(text, language = 'en') {
217
+ const charsPerToken = language === 'en' ? 4 : 3;
218
+ return Math.ceil(text.length / charsPerToken);
219
+ }
220
+ /**
221
+ * Estimates translation cost using Claude Haiku pricing
222
+ * Haiku pricing (as of 2025): $0.25 per 1M input tokens, $1.25 per 1M output tokens
223
+ *
224
+ * @param inputTokens - Input token count
225
+ * @param outputTokens - Output token count (defaults to input for balanced estimate)
226
+ * @returns Estimated cost in USD
227
+ */
228
+ export function estimateTranslationCost(inputTokens, outputTokens) {
229
+ const HAIKU_INPUT_COST_PER_1M = 0.25;
230
+ const HAIKU_OUTPUT_COST_PER_1M = 1.25;
231
+ const actualOutputTokens = outputTokens || inputTokens; // Assume similar length
232
+ const inputCost = (inputTokens / 1000000) * HAIKU_INPUT_COST_PER_1M;
233
+ const outputCost = (actualOutputTokens / 1000000) * HAIKU_OUTPUT_COST_PER_1M;
234
+ return inputCost + outputCost;
235
+ }
236
+ /**
237
+ * Generates translation prompt for LLM
238
+ *
239
+ * @param content - Content to translate
240
+ * @param sourceLanguage - Source language code
241
+ * @param targetLanguage - Target language code (default: 'en')
242
+ * @returns Translation prompt for LLM
243
+ */
244
+ export function generateTranslationPrompt(content, sourceLanguage, targetLanguage = 'en') {
245
+ const languageNames = {
246
+ en: 'English',
247
+ ru: 'Russian',
248
+ es: 'Spanish',
249
+ zh: 'Chinese',
250
+ de: 'German',
251
+ fr: 'French',
252
+ ja: 'Japanese',
253
+ ko: 'Korean',
254
+ pt: 'Portuguese',
255
+ ar: 'Arabic',
256
+ he: 'Hebrew',
257
+ unknown: 'Unknown'
258
+ };
259
+ const sourceName = languageNames[sourceLanguage] || sourceLanguage;
260
+ const targetName = languageNames[targetLanguage] || targetLanguage;
261
+ return `You are a technical translator specializing in software documentation.
262
+
263
+ Translate the following ${sourceName} document to ${targetName}.
264
+
265
+ PRESERVATION RULES (CRITICAL):
266
+ 1. **Markdown Formatting**: Preserve ALL markdown syntax exactly (headers, lists, links, code blocks, tables)
267
+ 2. **YAML Frontmatter**: Keep structure intact, translate values only
268
+ 3. **Code Blocks**: NEVER translate code (keep as-is, including comments if in English)
269
+ 4. **Inline Code**: NEVER translate \`code spans\` (keep as-is)
270
+ 5. **Technical Terms**: Keep in English (Git, Docker, Kubernetes, TypeScript, React, etc.)
271
+ 6. **Framework Terms**: Keep in English (Increment, Living Docs, SpecWeave, ADR, RFC, HLD, PRD)
272
+ 7. **Document Structure**: Maintain exact heading hierarchy and nesting
273
+ 8. **Links**: Preserve link structure, translate link text only if needed
274
+ 9. **Formatting**: Preserve bold (**text**), italic (*text*), code spans (\`code\`)
275
+ 10. **Placeholders**: Do NOT translate placeholders like __CODE_BLOCK_0__, __INLINE_CODE_1__, __LINK_2__
276
+ 11. **IDs and References**: Keep task IDs (T-001), test IDs (TC-001), user story IDs (US-001) unchanged
277
+
278
+ TRANSLATION STYLE:
279
+ - Professional technical ${targetName}
280
+ - Clear, concise, unambiguous language
281
+ - Industry-standard terminology
282
+ - Consistent term usage throughout
283
+ - Natural phrasing (not word-for-word literal)
284
+
285
+ SOURCE DOCUMENT (${sourceName}):
286
+ ---
287
+ ${content}
288
+ ---
289
+
290
+ TRANSLATED ${targetName.toUpperCase()} VERSION (preserve all formatting):`;
291
+ }
292
+ /**
293
+ * Translates content to English using LLM (Claude Haiku)
294
+ * This function generates the prompt but delegates actual LLM invocation
295
+ * to the caller (via Task tool, skill, or direct API)
296
+ *
297
+ * @param content - Content to translate
298
+ * @param sourceLanguage - Source language code
299
+ * @returns Translation prompt and metadata (caller must invoke LLM)
300
+ *
301
+ * @example
302
+ * ```typescript
303
+ * const content = 'Это тестовый документ';
304
+ * const result = prepareTranslation(content, 'ru');
305
+ * // Caller then invokes LLM with result.prompt
306
+ * ```
307
+ */
308
+ export function prepareTranslation(content, sourceLanguage, targetLanguage = 'en') {
309
+ // 1. Preserve code blocks and links
310
+ const preserved = preserveCodeBlocks(content);
311
+ // 2. Generate translation prompt
312
+ const prompt = generateTranslationPrompt(preserved.preserved, sourceLanguage, targetLanguage);
313
+ // 3. Estimate cost
314
+ const inputTokens = estimateTokens(prompt, sourceLanguage);
315
+ const outputTokens = estimateTokens(preserved.preserved, targetLanguage);
316
+ const estimatedCost = estimateTranslationCost(inputTokens, outputTokens);
317
+ return {
318
+ prompt,
319
+ preserved,
320
+ estimatedTokens: inputTokens + outputTokens,
321
+ estimatedCost
322
+ };
323
+ }
324
+ /**
325
+ * Post-processes translated content
326
+ * Restores code blocks, validates markdown, cleans up extra whitespace
327
+ *
328
+ * @param translated - Translated text from LLM
329
+ * @param preserved - Preserved content structure
330
+ * @returns Cleaned and restored translated content
331
+ */
332
+ export function postProcessTranslation(translated, preserved) {
333
+ // 1. Restore preserved blocks
334
+ let restored = restoreCodeBlocks(translated, preserved);
335
+ // 2. Clean up extra whitespace (LLM sometimes adds extra newlines)
336
+ restored = restored
337
+ .replace(/\n{4,}/g, '\n\n\n') // Max 3 consecutive newlines
338
+ .replace(/[ \t]+$/gm, ''); // Remove trailing spaces
339
+ // 3. Ensure file ends with single newline
340
+ restored = restored.trim() + '\n';
341
+ return restored;
342
+ }
343
+ /**
344
+ * Validates that translated content preserves markdown structure
345
+ * Returns warnings if structure doesn't match
346
+ *
347
+ * @param original - Original content
348
+ * @param translated - Translated content
349
+ * @returns Array of validation warnings (empty if valid)
350
+ */
351
+ export function validateTranslation(original, translated) {
352
+ const warnings = [];
353
+ // 1. Check heading count matches
354
+ const originalHeadings = (original.match(/^#{1,6}\s/gm) || []).length;
355
+ const translatedHeadings = (translated.match(/^#{1,6}\s/gm) || []).length;
356
+ if (originalHeadings !== translatedHeadings) {
357
+ warnings.push(`Heading count mismatch: original has ${originalHeadings}, translated has ${translatedHeadings}`);
358
+ }
359
+ // 2. Check code block count matches
360
+ const originalCodeBlocks = (original.match(/```/g) || []).length;
361
+ const translatedCodeBlocks = (translated.match(/```/g) || []).length;
362
+ if (originalCodeBlocks !== translatedCodeBlocks) {
363
+ warnings.push(`Code block count mismatch: original has ${originalCodeBlocks}, translated has ${translatedCodeBlocks}`);
364
+ }
365
+ // 3. Check link count matches
366
+ const originalLinks = (original.match(/\[([^\]]+)\]\(([^)]+)\)/g) || []).length;
367
+ const translatedLinks = (translated.match(/\[([^\]]+)\]\(([^)]+)\)/g) || []).length;
368
+ if (originalLinks !== translatedLinks) {
369
+ warnings.push(`Link count mismatch: original has ${originalLinks}, translated has ${translatedLinks}`);
370
+ }
371
+ // 4. Check YAML frontmatter present in both (if exists in original)
372
+ const hasOriginalYAML = /^---\n[\s\S]*?\n---/m.test(original);
373
+ const hasTranslatedYAML = /^---\n[\s\S]*?\n---/m.test(translated);
374
+ if (hasOriginalYAML && !hasTranslatedYAML) {
375
+ warnings.push('YAML frontmatter missing in translation');
376
+ }
377
+ return warnings;
378
+ }
379
+ /**
380
+ * Gets human-readable language name
381
+ *
382
+ * @param code - Language code
383
+ * @returns Human-readable name
384
+ */
385
+ export function getLanguageName(code) {
386
+ const names = {
387
+ en: 'English',
388
+ ru: 'Russian',
389
+ es: 'Spanish',
390
+ zh: 'Chinese',
391
+ de: 'German',
392
+ fr: 'French',
393
+ ja: 'Japanese',
394
+ ko: 'Korean',
395
+ pt: 'Portuguese',
396
+ ar: 'Arabic',
397
+ he: 'Hebrew',
398
+ unknown: 'Unknown'
399
+ };
400
+ return names[code] || code;
401
+ }
402
+ /**
403
+ * Formats cost for display
404
+ *
405
+ * @param cost - Cost in USD
406
+ * @returns Formatted string (e.g., "$0.0025" or "<$0.001")
407
+ */
408
+ export function formatCost(cost) {
409
+ if (cost < 0.001) {
410
+ return '<$0.001';
411
+ }
412
+ return `$${cost.toFixed(4)}`;
413
+ }
414
+ //# sourceMappingURL=translation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translation.js","sourceRoot":"","sources":["../../../src/utils/translation.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specweave-ado",
3
- "version": "0.1.0",
3
+ "version": "0.22.14",
4
4
  "description": "Azure DevOps integration for SpecWeave - sync increments with ADO work items, track progress, and manage project workflows",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
@@ -373,7 +373,6 @@ ${userStory.technicalContext}
373
373
  return mapping.task || "Task";
374
374
  case "Subtask":
375
375
  return mapping.task || "Task";
376
- // ADO doesn't have subtasks, use Task
377
376
  default:
378
377
  return "User Story";
379
378
  }
@@ -402,7 +402,7 @@ export async function loadSpecMetadata(specPath: string): Promise<SpecMetadata>
402
402
  }
403
403
 
404
404
  /**
405
- * Perform bidirectional sync with conflict resolution
405
+ * Perform three-permission sync with conflict resolution
406
406
  */
407
407
  export async function performBidirectionalSync(
408
408
  specPath: string,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-alternatives",
3
3
  "description": "Compare SpecWeave with BMAD, spec-kit, openspec, and other spec-driven frameworks. Get gap analysis, feature comparison, and strategic recommendations to choose the best framework for your needs.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-backend",
3
3
  "description": "Backend API development for Node.js, Python, and .NET stacks. Includes Express, NestJS, FastAPI, Django, Flask, ASP.NET Core, and Entity Framework Core. Focus on REST APIs, authentication, database operations, and background services.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-confluent",
3
3
  "description": "Confluent Cloud integration for SpecWeave - Schema Registry, ksqlDB, Kafka Connect, Flink, stream processing, and enterprise Kafka features",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-cost-optimizer",
3
3
  "description": "Cloud cost optimization and platform comparison. Analyzes infrastructure requirements and recommends cheapest cloud platform (Hetzner, Vercel, AWS, Railway, Fly.io, DigitalOcean). Shows cost breakdown and savings calculations.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-diagrams",
3
3
  "description": "Architecture diagram generation with Mermaid following C4 Model conventions. Creates C4 Context/Container/Component diagrams, sequence diagrams, ER diagrams, and deployment diagrams. SpecWeave-aware for HLD/LLD documentation.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-docs",
3
3
  "description": "Documentation generation and spec-driven workflows. Includes Docusaurus site generation from SpecWeave structure, spec-driven brainstorming for feature ideation, and spec-driven debugging. Focus on living documentation and knowledge management.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-docs-preview",
3
3
  "description": "Interactive documentation preview with Docusaurus. Launch local dev server to view living documentation in beautiful UI with hot reload, auto-generated sidebar, and Mermaid diagrams. Build static sites for deployment.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-figma",
3
3
  "description": "Design-to-code workflow patterns for Figma (MCP-first). Requires Figma MCP server. Extracts design tokens, generates components (React/Angular/Vue/Svelte), scaffolds tests. Uses Atomic Design and TypeScript.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-frontend",
3
3
  "description": "Frontend development for React, Vue, and Angular projects. Includes Next.js 14+ App Router support, design system architecture (Atomic Design), and UI component best practices. Focus on modern frontend patterns and performance.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "specweave-github",
3
3
  "description": "GitHub Issues integration for SpecWeave increments. Bidirectional sync between SpecWeave increments and GitHub Issues. Automatically creates issues from increments, tracks progress, and closes issues on completion. Uses GitHub CLI (gh) for seamless integration.",
4
- "version": "1.0.0",
4
+ "version": "0.22.14",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -53,7 +53,7 @@ description: Update GitHub issue for user story with proper ACs and tasks
53
53
  **What Gets Updated**:
54
54
 
55
55
  ```markdown
56
- **Feature**: [FS-031](../../_features/FS-031/FEATURE.md)
56
+ **Feature**: [FS-031](../../_features/_archive/FS-031/FEATURE.md)
57
57
  **Status**: complete
58
58
  **Priority**: P1
59
59
  **Project**: default
@@ -201,35 +201,50 @@ else
201
201
  fi
202
202
 
203
203
  # ============================================================================
204
- # EPIC GITHUB ISSUE SYNC (Update Epic issue with fresh task progress)
204
+ # EPIC GITHUB ISSUE SYNC (DEPRECATED v0.24.0+)
205
+ # ============================================================================
206
+ #
207
+ # ⚠️ DEPRECATED: SpecWeave now syncs ONLY at User Story level.
208
+ #
209
+ # Feature/Epic-level issues are no longer updated.
210
+ # Use /specweave-github:sync instead to sync User Story issues.
211
+ #
212
+ # To re-enable (NOT recommended):
213
+ # export SPECWEAVE_ENABLE_EPIC_SYNC=true
214
+ #
215
+ # @see .specweave/increments/0047-us-task-linkage/reports/GITHUB-TITLE-FORMAT-FIX-PLAN.md
205
216
  # ============================================================================
206
217
 
207
- echo "[$(date)] [GitHub] 🔄 Checking for Epic GitHub issue update..." >> "$DEBUG_LOG" 2>/dev/null || true
218
+ if [ "$SPECWEAVE_ENABLE_EPIC_SYNC" = "true" ]; then
219
+ echo "[$(date)] [GitHub] 🔄 Checking for Epic GitHub issue update (DEPRECATED)..." >> "$DEBUG_LOG" 2>/dev/null || true
208
220
 
209
- # Find active increment ID
210
- ACTIVE_INCREMENT=$(ls -t .specweave/increments/ | grep -v '^\.' | while read inc; do
211
- if [ -f ".specweave/increments/$inc/metadata.json" ]; then
212
- STATUS=$(grep -o '"status"[[:space:]]*:[[:space:]]*"[^"]*"' ".specweave/increments/$inc/metadata.json" 2>/dev/null | sed 's/.*"\([^"]*\)".*/\1/' || true)
213
- if [ "$STATUS" = "active" ]; then
214
- echo "$inc"
215
- break
221
+ # Find active increment ID
222
+ ACTIVE_INCREMENT=$(ls -t .specweave/increments/ | grep -v '^\.' | while read inc; do
223
+ if [ -f ".specweave/increments/$inc/metadata.json" ]; then
224
+ STATUS=$(grep -o '"status"[[:space:]]*:[[:space:]]*"[^"]*"' ".specweave/increments/$inc/metadata.json" 2>/dev/null | sed 's/.*"\([^"]*\)".*/\1/' || true)
225
+ if [ "$STATUS" = "active" ]; then
226
+ echo "$inc"
227
+ break
228
+ fi
229
+ fi
230
+ done | head -1)
231
+
232
+ if [ -n "$ACTIVE_INCREMENT" ]; then
233
+ echo "[$(date)] [GitHub] 🎯 Active increment: $ACTIVE_INCREMENT" >> "$DEBUG_LOG" 2>/dev/null || true
234
+
235
+ # Run Epic sync script (silently, errors logged to debug log)
236
+ if [ -f "$PROJECT_ROOT/scripts/update-epic-github-issue.sh" ]; then
237
+ echo "[$(date)] [GitHub] 🚀 Updating Epic GitHub issue (DEPRECATED)..." >> "$DEBUG_LOG" 2>/dev/null || true
238
+ "$PROJECT_ROOT/scripts/update-epic-github-issue.sh" "$ACTIVE_INCREMENT" >> "$DEBUG_LOG" 2>&1 || true
239
+ echo "[$(date)] [GitHub] ⚠️ Epic sync is deprecated. Use /specweave-github:sync instead." >> "$DEBUG_LOG" 2>/dev/null || true
240
+ else
241
+ echo "[$(date)] [GitHub] ⚠️ Epic sync script not found, skipping" >> "$DEBUG_LOG" 2>/dev/null || true
216
242
  fi
217
- fi
218
- done | head -1)
219
-
220
- if [ -n "$ACTIVE_INCREMENT" ]; then
221
- echo "[$(date)] [GitHub] 🎯 Active increment: $ACTIVE_INCREMENT" >> "$DEBUG_LOG" 2>/dev/null || true
222
-
223
- # Run Epic sync script (silently, errors logged to debug log)
224
- if [ -f "$PROJECT_ROOT/scripts/update-epic-github-issue.sh" ]; then
225
- echo "[$(date)] [GitHub] 🚀 Updating Epic GitHub issue..." >> "$DEBUG_LOG" 2>/dev/null || true
226
- "$PROJECT_ROOT/scripts/update-epic-github-issue.sh" "$ACTIVE_INCREMENT" >> "$DEBUG_LOG" 2>&1 || true
227
- echo "[$(date)] [GitHub] ✅ Epic sync complete (see logs for details)" >> "$DEBUG_LOG" 2>/dev/null || true
228
243
  else
229
- echo "[$(date)] [GitHub] ⚠️ Epic sync script not found, skipping" >> "$DEBUG_LOG" 2>/dev/null || true
244
+ echo "[$(date)] [GitHub] ℹ️ No active increment found, skipping Epic sync" >> "$DEBUG_LOG" 2>/dev/null || true
230
245
  fi
231
246
  else
232
- echo "[$(date)] [GitHub] ℹ️ No active increment found, skipping Epic sync" >> "$DEBUG_LOG" 2>/dev/null || true
247
+ echo "[$(date)] [GitHub] ℹ️ Epic sync disabled (sync at User Story level only)" >> "$DEBUG_LOG" 2>/dev/null || true
233
248
  fi
234
249
 
235
250
  # ============================================================================
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Three-Layer Bidirectional Sync Manager
2
+ * Three-Layer Full Sync Manager (All Permissions Enabled)
3
3
  *
4
4
  * Handles synchronization across three layers:
5
5
  * - Layer 1: GitHub Issue (stakeholder UI)