specweave 0.24.13 → 0.26.2

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 (377) hide show
  1. package/CLAUDE.md +586 -18
  2. package/bin/specweave.js +14 -0
  3. package/dist/plugins/specweave-github/lib/CodeValidator.js +2 -2
  4. package/dist/plugins/specweave-github/lib/CodeValidator.js.map +1 -1
  5. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +1 -1
  6. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js.map +1 -1
  7. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
  8. package/dist/plugins/specweave-github/lib/github-client-v2.js +17 -1
  9. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  10. package/dist/plugins/specweave-github/lib/github-issue-updater.js +1 -1
  11. package/dist/plugins/specweave-github/lib/github-issue-updater.js.map +1 -1
  12. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js +1 -1
  13. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js.map +1 -1
  14. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js +1 -1
  15. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js.map +1 -1
  16. package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -1
  17. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +7 -6
  18. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -1
  19. package/dist/plugins/specweave-jira/lib/jira-epic-sync.js +1 -1
  20. package/dist/plugins/specweave-jira/lib/jira-epic-sync.js.map +1 -1
  21. package/dist/src/adapters/adapter-base.js +1 -1
  22. package/dist/src/adapters/adapter-base.js.map +1 -1
  23. package/dist/src/adapters/adapter-loader.js +1 -1
  24. package/dist/src/adapters/adapter-loader.js.map +1 -1
  25. package/dist/src/adapters/agents-md-generator.js +1 -1
  26. package/dist/src/adapters/agents-md-generator.js.map +1 -1
  27. package/dist/src/adapters/claude/adapter.js +1 -1
  28. package/dist/src/adapters/claude/adapter.js.map +1 -1
  29. package/dist/src/adapters/claude-md-generator.js +1 -1
  30. package/dist/src/adapters/claude-md-generator.js.map +1 -1
  31. package/dist/src/adapters/codex/adapter.js +1 -1
  32. package/dist/src/adapters/codex/adapter.js.map +1 -1
  33. package/dist/src/adapters/cursor/adapter.js +1 -1
  34. package/dist/src/adapters/cursor/adapter.js.map +1 -1
  35. package/dist/src/adapters/doc-generator.js +1 -1
  36. package/dist/src/adapters/doc-generator.js.map +1 -1
  37. package/dist/src/adapters/gemini/adapter.js +1 -1
  38. package/dist/src/adapters/gemini/adapter.js.map +1 -1
  39. package/dist/src/adapters/generic/adapter.js +1 -1
  40. package/dist/src/adapters/generic/adapter.js.map +1 -1
  41. package/dist/src/cli/commands/cicd-monitor.js +1 -1
  42. package/dist/src/cli/commands/cicd-monitor.js.map +1 -1
  43. package/dist/src/cli/commands/delete-feature.d.ts +14 -0
  44. package/dist/src/cli/commands/delete-feature.d.ts.map +1 -0
  45. package/dist/src/cli/commands/delete-feature.js +87 -0
  46. package/dist/src/cli/commands/delete-feature.js.map +1 -0
  47. package/dist/src/cli/commands/detect-specs.js +1 -1
  48. package/dist/src/cli/commands/detect-specs.js.map +1 -1
  49. package/dist/src/cli/commands/import-external.js +1 -1
  50. package/dist/src/cli/commands/import-external.js.map +1 -1
  51. package/dist/src/cli/commands/init.d.ts.map +1 -1
  52. package/dist/src/cli/commands/init.js +39 -49
  53. package/dist/src/cli/commands/init.js.map +1 -1
  54. package/dist/src/cli/commands/install.js +1 -1
  55. package/dist/src/cli/commands/install.js.map +1 -1
  56. package/dist/src/cli/commands/list.js +1 -1
  57. package/dist/src/cli/commands/list.js.map +1 -1
  58. package/dist/src/cli/commands/migrate-to-multiproject.js +1 -1
  59. package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
  60. package/dist/src/cli/commands/migrate-to-profiles.js +1 -1
  61. package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -1
  62. package/dist/src/cli/commands/plan/agent-invoker.js +1 -1
  63. package/dist/src/cli/commands/repair-status-desync.js +1 -1
  64. package/dist/src/cli/commands/repair-status-desync.js.map +1 -1
  65. package/dist/src/cli/commands/revert-wip-limit.js +1 -1
  66. package/dist/src/cli/commands/revert-wip-limit.js.map +1 -1
  67. package/dist/src/cli/commands/sync-specs.js +1 -1
  68. package/dist/src/cli/commands/sync-specs.js.map +1 -1
  69. package/dist/src/cli/helpers/init/initial-increment-generator.js +1 -1
  70. package/dist/src/cli/helpers/init/initial-increment-generator.js.map +1 -1
  71. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
  72. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +13 -46
  73. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
  74. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  75. package/dist/src/cli/helpers/issue-tracker/index.js +12 -31
  76. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  77. package/dist/src/cli/helpers/issue-tracker/types.d.ts +6 -1
  78. package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
  79. package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
  80. package/dist/src/config/import-config.js +1 -1
  81. package/dist/src/config/import-config.js.map +1 -1
  82. package/dist/src/config/types.d.ts +203 -1208
  83. package/dist/src/config/types.d.ts.map +1 -1
  84. package/dist/src/core/ac-test-validator-cli.js +1 -1
  85. package/dist/src/core/ac-test-validator-cli.js.map +1 -1
  86. package/dist/src/core/ac-test-validator.js +1 -1
  87. package/dist/src/core/ac-test-validator.js.map +1 -1
  88. package/dist/src/core/brownfield/analyzer.js +1 -1
  89. package/dist/src/core/brownfield/analyzer.js.map +1 -1
  90. package/dist/src/core/brownfield/importer.js +1 -1
  91. package/dist/src/core/brownfield/importer.js.map +1 -1
  92. package/dist/src/core/cicd/config-loader.js +1 -1
  93. package/dist/src/core/cicd/config-loader.js.map +1 -1
  94. package/dist/src/core/cicd/notifier.js +1 -1
  95. package/dist/src/core/cicd/notifier.js.map +1 -1
  96. package/dist/src/core/cicd/parent-repo-validator.js +1 -1
  97. package/dist/src/core/cicd/parent-repo-validator.js.map +1 -1
  98. package/dist/src/core/cicd/state-manager.js +1 -1
  99. package/dist/src/core/cicd/state-manager.js.map +1 -1
  100. package/dist/src/core/config-manager.js +1 -1
  101. package/dist/src/core/config-manager.js.map +1 -1
  102. package/dist/src/core/cost-tracker.js +1 -1
  103. package/dist/src/core/cost-tracker.js.map +1 -1
  104. package/dist/src/core/deduplication/command-deduplicator.js +1 -1
  105. package/dist/src/core/deduplication/command-deduplicator.js.map +1 -1
  106. package/dist/src/core/feature-deleter/audit-logger.d.ts +30 -0
  107. package/dist/src/core/feature-deleter/audit-logger.d.ts.map +1 -0
  108. package/dist/src/core/feature-deleter/audit-logger.js +77 -0
  109. package/dist/src/core/feature-deleter/audit-logger.js.map +1 -0
  110. package/dist/src/core/feature-deleter/confirmation-manager.d.ts +39 -0
  111. package/dist/src/core/feature-deleter/confirmation-manager.d.ts.map +1 -0
  112. package/dist/src/core/feature-deleter/confirmation-manager.js +89 -0
  113. package/dist/src/core/feature-deleter/confirmation-manager.js.map +1 -0
  114. package/dist/src/core/feature-deleter/deletion-transaction.d.ts +51 -0
  115. package/dist/src/core/feature-deleter/deletion-transaction.d.ts.map +1 -0
  116. package/dist/src/core/feature-deleter/deletion-transaction.js +185 -0
  117. package/dist/src/core/feature-deleter/deletion-transaction.js.map +1 -0
  118. package/dist/src/core/feature-deleter/git-service.d.ts +43 -0
  119. package/dist/src/core/feature-deleter/git-service.d.ts.map +1 -0
  120. package/dist/src/core/feature-deleter/git-service.js +127 -0
  121. package/dist/src/core/feature-deleter/git-service.js.map +1 -0
  122. package/dist/src/core/feature-deleter/github-service.d.ts +36 -0
  123. package/dist/src/core/feature-deleter/github-service.d.ts.map +1 -0
  124. package/dist/src/core/feature-deleter/github-service.js +102 -0
  125. package/dist/src/core/feature-deleter/github-service.js.map +1 -0
  126. package/dist/src/core/feature-deleter/index.d.ts +35 -0
  127. package/dist/src/core/feature-deleter/index.d.ts.map +1 -0
  128. package/dist/src/core/feature-deleter/index.js +199 -0
  129. package/dist/src/core/feature-deleter/index.js.map +1 -0
  130. package/dist/src/core/feature-deleter/types.d.ts +179 -0
  131. package/dist/src/core/feature-deleter/types.d.ts.map +1 -0
  132. package/dist/src/core/feature-deleter/types.js +7 -0
  133. package/dist/src/core/feature-deleter/types.js.map +1 -0
  134. package/dist/src/core/feature-deleter/validator.d.ts +46 -0
  135. package/dist/src/core/feature-deleter/validator.d.ts.map +1 -0
  136. package/dist/src/core/feature-deleter/validator.js +231 -0
  137. package/dist/src/core/feature-deleter/validator.js.map +1 -0
  138. package/dist/src/core/hooks/HealthReporter.js +1 -1
  139. package/dist/src/core/hooks/HealthReporter.js.map +1 -1
  140. package/dist/src/core/hooks/HookAutoFixer.js +1 -1
  141. package/dist/src/core/hooks/HookAutoFixer.js.map +1 -1
  142. package/dist/src/core/hooks/HookScanner.js +1 -1
  143. package/dist/src/core/hooks/HookScanner.js.map +1 -1
  144. package/dist/src/core/i18n/language-manager.js +1 -1
  145. package/dist/src/core/i18n/language-manager.js.map +1 -1
  146. package/dist/src/core/i18n/locale-manager.js +1 -1
  147. package/dist/src/core/i18n/locale-manager.js.map +1 -1
  148. package/dist/src/core/i18n/system-prompt-injector.js +1 -1
  149. package/dist/src/core/i18n/system-prompt-injector.js.map +1 -1
  150. package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
  151. package/dist/src/core/increment/ac-status-manager.js +18 -4
  152. package/dist/src/core/increment/ac-status-manager.js.map +1 -1
  153. package/dist/src/core/increment/active-increment-manager.js +1 -1
  154. package/dist/src/core/increment/active-increment-manager.js.map +1 -1
  155. package/dist/src/core/increment/completion-validator.js +1 -1
  156. package/dist/src/core/increment/completion-validator.js.map +1 -1
  157. package/dist/src/core/increment/conflict-resolver.js +1 -1
  158. package/dist/src/core/increment/conflict-resolver.js.map +1 -1
  159. package/dist/src/core/increment/desync-detector.js +1 -1
  160. package/dist/src/core/increment/desync-detector.js.map +1 -1
  161. package/dist/src/core/increment/discipline-checker.js +1 -1
  162. package/dist/src/core/increment/discipline-checker.js.map +1 -1
  163. package/dist/src/core/increment/duplicate-detector.js +1 -1
  164. package/dist/src/core/increment/duplicate-detector.js.map +1 -1
  165. package/dist/src/core/increment/increment-archiver.js +1 -1
  166. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  167. package/dist/src/core/increment/increment-reopener.js +1 -1
  168. package/dist/src/core/increment/increment-reopener.js.map +1 -1
  169. package/dist/src/core/increment/metadata-manager.js +1 -1
  170. package/dist/src/core/increment/metadata-manager.js.map +1 -1
  171. package/dist/src/core/increment/metadata-validator.js +1 -1
  172. package/dist/src/core/increment/metadata-validator.js.map +1 -1
  173. package/dist/src/core/increment/recent-work-scanner.js +1 -1
  174. package/dist/src/core/increment/recent-work-scanner.js.map +1 -1
  175. package/dist/src/core/increment/spec-frontmatter-updater.js +1 -1
  176. package/dist/src/core/increment/spec-frontmatter-updater.js.map +1 -1
  177. package/dist/src/core/increment/status-auto-transition.js +1 -1
  178. package/dist/src/core/increment/status-auto-transition.js.map +1 -1
  179. package/dist/src/core/increment-status.js +1 -1
  180. package/dist/src/core/increment-status.js.map +1 -1
  181. package/dist/src/core/living-docs/content-distributor.js +1 -1
  182. package/dist/src/core/living-docs/content-distributor.js.map +1 -1
  183. package/dist/src/core/living-docs/cross-linker.js +1 -1
  184. package/dist/src/core/living-docs/cross-linker.js.map +1 -1
  185. package/dist/src/core/living-docs/feature-archiver.js +1 -1
  186. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  187. package/dist/src/core/living-docs/feature-id-manager.js +1 -1
  188. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  189. package/dist/src/core/living-docs/hierarchy-mapper.js +1 -1
  190. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  191. package/dist/src/core/living-docs/living-docs-sync.d.ts +14 -0
  192. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  193. package/dist/src/core/living-docs/living-docs-sync.js +72 -13
  194. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  195. package/dist/src/core/living-docs/project-detector.js +1 -1
  196. package/dist/src/core/living-docs/project-detector.js.map +1 -1
  197. package/dist/src/core/living-docs/task-project-specific-generator.js +1 -1
  198. package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -1
  199. package/dist/src/core/logging/prompt-logger.js +1 -1
  200. package/dist/src/core/logging/prompt-logger.js.map +1 -1
  201. package/dist/src/core/plugin-loader.js +1 -1
  202. package/dist/src/core/plugin-loader.js.map +1 -1
  203. package/dist/src/core/project-manager.js +1 -1
  204. package/dist/src/core/project-manager.js.map +1 -1
  205. package/dist/src/core/qa/qa-runner.js +1 -1
  206. package/dist/src/core/qa/qa-runner.js.map +1 -1
  207. package/dist/src/core/repo-structure/folder-detector.js +1 -1
  208. package/dist/src/core/repo-structure/folder-detector.js.map +1 -1
  209. package/dist/src/core/repo-structure/setup-state-manager.js +1 -1
  210. package/dist/src/core/repo-structure/setup-state-manager.js.map +1 -1
  211. package/dist/src/core/spec-detector.js +1 -1
  212. package/dist/src/core/spec-detector.js.map +1 -1
  213. package/dist/src/core/specs/spec-metadata-manager.js +1 -1
  214. package/dist/src/core/specs/spec-metadata-manager.js.map +1 -1
  215. package/dist/src/core/status-line/status-line-updater.js +1 -1
  216. package/dist/src/core/status-line/status-line-updater.js.map +1 -1
  217. package/dist/src/core/status-line-validator.js +1 -1
  218. package/dist/src/core/status-line-validator.js.map +1 -1
  219. package/dist/src/core/sync/bidirectional-engine.js +1 -1
  220. package/dist/src/core/sync/bidirectional-engine.js.map +1 -1
  221. package/dist/src/core/sync/profile-manager.js +1 -1
  222. package/dist/src/core/sync/profile-manager.js.map +1 -1
  223. package/dist/src/core/sync/project-context.js +1 -1
  224. package/dist/src/core/sync/project-context.js.map +1 -1
  225. package/dist/src/core/sync/sync-event-logger.js +1 -1
  226. package/dist/src/core/sync/sync-event-logger.js.map +1 -1
  227. package/dist/src/core/types/config.js +1 -1
  228. package/dist/src/core/types/config.js.map +1 -1
  229. package/dist/src/core/us-completion-detector.d.ts +124 -0
  230. package/dist/src/core/us-completion-detector.d.ts.map +1 -0
  231. package/dist/src/core/us-completion-detector.js +270 -0
  232. package/dist/src/core/us-completion-detector.js.map +1 -0
  233. package/dist/src/core/utils/permission-checker.js +1 -1
  234. package/dist/src/core/utils/permission-checker.js.map +1 -1
  235. package/dist/src/core/workflow/autonomous-executor.js +1 -1
  236. package/dist/src/core/workflow/autonomous-executor.js.map +1 -1
  237. package/dist/src/core/workflow/backlog-scanner.js +1 -1
  238. package/dist/src/core/workflow/backlog-scanner.js.map +1 -1
  239. package/dist/src/core/workflow/cost-estimator.js +1 -1
  240. package/dist/src/core/workflow/cost-estimator.js.map +1 -1
  241. package/dist/src/core/workflow/state-manager.js +1 -1
  242. package/dist/src/core/workflow/state-manager.js.map +1 -1
  243. package/dist/src/importers/duplicate-detector.js +1 -1
  244. package/dist/src/importers/duplicate-detector.js.map +1 -1
  245. package/dist/src/importers/item-converter.js +1 -1
  246. package/dist/src/importers/item-converter.js.map +1 -1
  247. package/dist/src/init/architecture/types.d.ts +33 -140
  248. package/dist/src/init/architecture/types.d.ts.map +1 -1
  249. package/dist/src/init/compliance/types.d.ts +30 -27
  250. package/dist/src/init/compliance/types.d.ts.map +1 -1
  251. package/dist/src/init/repo/types.d.ts +11 -34
  252. package/dist/src/init/repo/types.d.ts.map +1 -1
  253. package/dist/src/init/research/src/config/types.d.ts +15 -82
  254. package/dist/src/init/research/src/config/types.d.ts.map +1 -1
  255. package/dist/src/init/research/types.d.ts +38 -93
  256. package/dist/src/init/research/types.d.ts.map +1 -1
  257. package/dist/src/init/team/types.d.ts +4 -42
  258. package/dist/src/init/team/types.d.ts.map +1 -1
  259. package/dist/src/integrations/jira/jira-incremental-mapper.d.ts +1 -1
  260. package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
  261. package/dist/src/integrations/jira/jira-incremental-mapper.js +3 -3
  262. package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
  263. package/dist/src/living-docs/fs-id-allocator.js +1 -1
  264. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  265. package/dist/src/living-docs/id-registry.js +1 -1
  266. package/dist/src/living-docs/id-registry.js.map +1 -1
  267. package/dist/src/sync/external-item-sync-service.js +1 -1
  268. package/dist/src/sync/external-item-sync-service.js.map +1 -1
  269. package/dist/src/sync/sync-metadata.js +1 -1
  270. package/dist/src/sync/sync-metadata.js.map +1 -1
  271. package/dist/src/utils/agents-md-compiler.js +1 -1
  272. package/dist/src/utils/agents-md-compiler.js.map +1 -1
  273. package/dist/src/utils/auto-install.js +1 -1
  274. package/dist/src/utils/auto-install.js.map +1 -1
  275. package/dist/src/utils/cost-reporter.js +1 -1
  276. package/dist/src/utils/cost-reporter.js.map +1 -1
  277. package/dist/src/utils/docs-preview/config-generator.js +1 -1
  278. package/dist/src/utils/docs-preview/config-generator.js.map +1 -1
  279. package/dist/src/utils/docs-preview/docusaurus-setup.js +1 -1
  280. package/dist/src/utils/docs-preview/docusaurus-setup.js.map +1 -1
  281. package/dist/src/utils/docs-preview/package-installer.js +1 -1
  282. package/dist/src/utils/docs-preview/package-installer.js.map +1 -1
  283. package/dist/src/utils/docs-preview/sidebar-builder.js +1 -1
  284. package/dist/src/utils/docs-preview/sidebar-builder.js.map +1 -1
  285. package/dist/src/utils/env-file-generator.js +1 -1
  286. package/dist/src/utils/env-file-generator.js.map +1 -1
  287. package/dist/src/utils/external-resource-validator.js +1 -1
  288. package/dist/src/utils/external-resource-validator.js.map +1 -1
  289. package/dist/src/utils/fs-native.d.ts +51 -5
  290. package/dist/src/utils/fs-native.d.ts.map +1 -1
  291. package/dist/src/utils/fs-native.js +100 -5
  292. package/dist/src/utils/fs-native.js.map +1 -1
  293. package/dist/src/utils/plugin-validator.js +1 -1
  294. package/dist/src/utils/plugin-validator.js.map +1 -1
  295. package/dist/src/utils/project-detection.js +1 -1
  296. package/dist/src/utils/project-detection.js.map +1 -1
  297. package/dist/src/utils/project-validator.js +1 -1
  298. package/dist/src/utils/project-validator.js.map +1 -1
  299. package/dist/src/utils/spec-parser.js +1 -1
  300. package/dist/src/utils/spec-parser.js.map +1 -1
  301. package/dist/src/utils/spec-splitter.js +1 -1
  302. package/dist/src/utils/spec-splitter.js.map +1 -1
  303. package/dist/src/validators/ac-coverage-validator.js +1 -1
  304. package/dist/src/validators/ac-coverage-validator.js.map +1 -1
  305. package/package.json +5 -6
  306. package/plugins/specweave/agents/code-standards-detective/AGENT.md +47 -0
  307. package/plugins/specweave/agents/docs-writer/AGENT.md +134 -1
  308. package/plugins/specweave/agents/increment-quality-judge-v2/AGENT.md +1 -0
  309. package/plugins/specweave/agents/infrastructure/AGENT.md +48 -1
  310. package/plugins/specweave/agents/performance/AGENT.md +46 -0
  311. package/plugins/specweave/agents/pm/AGENT.md +115 -3
  312. package/plugins/specweave/agents/qa-lead/AGENT.md +40 -1
  313. package/plugins/specweave/agents/reflective-reviewer/AGENT.md +5 -0
  314. package/plugins/specweave/agents/security/AGENT.md +45 -0
  315. package/plugins/specweave/agents/tdd-orchestrator/AGENT.md +128 -1
  316. package/plugins/specweave/agents/tech-lead/AGENT.md +138 -1
  317. package/plugins/specweave/agents/translator/AGENT.md +132 -0
  318. package/plugins/specweave/commands/specweave-sync-progress.md +616 -0
  319. package/plugins/specweave/hooks/hooks.json +0 -9
  320. package/plugins/specweave/hooks/post-increment-completion.sh +133 -0
  321. package/plugins/specweave/hooks/post-metadata-change.sh +28 -23
  322. package/plugins/specweave/hooks/post-task-completion.sh +7 -0
  323. package/plugins/specweave/hooks/pre-edit-write-consolidated.sh +44 -7
  324. package/plugins/specweave/hooks/shared/bulk-operation-detector.sh +167 -0
  325. package/plugins/specweave/lib/hooks/consolidated-sync.js +19 -2
  326. package/plugins/specweave/lib/hooks/us-completion-orchestrator.js +135 -0
  327. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +18 -4
  328. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -1
  329. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +1 -1
  330. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -1
  331. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +1 -1
  332. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -1
  333. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +1 -1
  334. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -1
  335. package/plugins/specweave/skills/code-reviewer/SKILL.md +1 -1
  336. package/plugins/specweave/skills/progress-sync/SKILL.md +405 -0
  337. package/plugins/specweave-ado/lib/ado-project-detector.js +1 -1
  338. package/plugins/specweave-ado/lib/ado-project-detector.ts +1 -1
  339. package/plugins/specweave-ado/lib/conflict-resolver.js +1 -1
  340. package/plugins/specweave-ado/lib/conflict-resolver.ts +1 -1
  341. package/plugins/specweave-backend/agents/database-optimizer/AGENT.md +1 -1
  342. package/plugins/specweave-frontend/agents/frontend-architect/AGENT.md +5 -0
  343. package/plugins/specweave-github/.claude-plugin/plugin.json +1 -15
  344. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +186 -0
  345. package/plugins/specweave-github/hooks/README.md +34 -25
  346. package/plugins/specweave-github/lib/CodeValidator.js +1 -1
  347. package/plugins/specweave-github/lib/CodeValidator.ts +2 -2
  348. package/plugins/specweave-github/lib/ThreeLayerSyncManager.js +1 -1
  349. package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +1 -1
  350. package/plugins/specweave-github/lib/github-client-v2.js +13 -1
  351. package/plugins/specweave-github/lib/github-client-v2.ts +17 -1
  352. package/plugins/specweave-github/lib/github-issue-updater.js +1 -1
  353. package/plugins/specweave-github/lib/github-issue-updater.ts +1 -1
  354. package/plugins/specweave-github/lib/github-sync-bidirectional.js +1 -1
  355. package/plugins/specweave-github/lib/github-sync-bidirectional.ts +1 -1
  356. package/plugins/specweave-github/lib/github-sync-increment-changes.js +1 -1
  357. package/plugins/specweave-github/lib/github-sync-increment-changes.ts +1 -1
  358. package/plugins/specweave-github/lib/user-story-issue-builder.js +4 -4
  359. package/plugins/specweave-github/lib/user-story-issue-builder.ts +7 -6
  360. package/plugins/specweave-infrastructure/agents/devops/AGENT.md +48 -1
  361. package/plugins/specweave-infrastructure/agents/network-engineer/AGENT.md +6 -1
  362. package/plugins/specweave-infrastructure/agents/observability-engineer/AGENT.md +6 -1
  363. package/plugins/specweave-infrastructure/agents/performance-engineer/AGENT.md +6 -1
  364. package/plugins/specweave-infrastructure/agents/sre/AGENT.md +5 -0
  365. package/plugins/specweave-jira/lib/jira-epic-sync.js +1 -1
  366. package/plugins/specweave-jira/lib/jira-epic-sync.ts +1 -1
  367. package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +5 -0
  368. package/plugins/specweave-kubernetes/agents/kubernetes-architect/AGENT.md +47 -2
  369. package/plugins/specweave-ml/agents/data-scientist/AGENT.md +1 -1
  370. package/plugins/specweave-ml/agents/ml-engineer/AGENT.md +5 -0
  371. package/plugins/specweave-ml/agents/mlops-engineer/AGENT.md +6 -1
  372. package/plugins/specweave-payments/agents/payment-integration/AGENT.md +1 -1
  373. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +138 -0
  374. package/plugins/specweave-ado/hooks/hooks.json +0 -15
  375. package/plugins/specweave-github/hooks/hooks.json +0 -15
  376. package/plugins/specweave-jira/hooks/hooks.json +0 -15
  377. package/plugins/specweave-release/hooks/hooks.json +0 -15
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Audit Logger for Feature Deletion
3
+ * Increment: 0053-safe-feature-deletion
4
+ * Tasks: T-030, T-031, T-032, T-033
5
+ */
6
+ import { consoleLogger } from '../../utils/logger.js';
7
+ import fs from 'fs/promises';
8
+ import path from 'path';
9
+ import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
10
+ /**
11
+ * Feature Deletion Audit Logger
12
+ * Writes deletion events to JSON Lines log with rotation
13
+ */
14
+ export class FeatureDeletionAuditLogger {
15
+ constructor(projectRoot, logger) {
16
+ this.MAX_LOG_SIZE = 10 * 1024 * 1024; // 10MB
17
+ this.logger = logger || consoleLogger;
18
+ this.logFile = path.join(projectRoot, '.specweave/logs/feature-deletions.log');
19
+ }
20
+ /**
21
+ * T-030, T-032, T-033: Log deletion event (JSON Lines format)
22
+ */
23
+ async logDeletion(event) {
24
+ try {
25
+ // T-031: Check log size and rotate if needed
26
+ await this.rotateIfNeeded();
27
+ // Get user from git config or environment
28
+ const user = await this.getUser();
29
+ // Create full event
30
+ const fullEvent = {
31
+ ...event,
32
+ timestamp: new Date().toISOString(),
33
+ user
34
+ };
35
+ // Append JSON line to log
36
+ const logLine = JSON.stringify(fullEvent) + '\n';
37
+ const logDir = path.dirname(this.logFile);
38
+ await fs.mkdir(logDir, { recursive: true });
39
+ await fs.appendFile(this.logFile, logLine);
40
+ this.logger.log(`Audit log written: ${event.featureId} (${event.status})`);
41
+ }
42
+ catch (error) {
43
+ this.logger.warn(`Failed to write audit log: ${error}`);
44
+ }
45
+ }
46
+ /**
47
+ * T-031: Rotate log if size exceeds 10MB
48
+ */
49
+ async rotateIfNeeded() {
50
+ try {
51
+ const stats = await fs.stat(this.logFile);
52
+ if (stats.size > this.MAX_LOG_SIZE) {
53
+ this.logger.log('Rotating audit log (>10MB)');
54
+ const rotatedFile = this.logFile + '.1';
55
+ // Rename current log to .1 (overwrite if exists)
56
+ await fs.rename(this.logFile, rotatedFile);
57
+ this.logger.log(`Log rotated: ${path.basename(rotatedFile)}`);
58
+ }
59
+ }
60
+ catch (error) {
61
+ // Log file doesn't exist yet - not an error
62
+ }
63
+ }
64
+ /**
65
+ * Get user from git config or environment
66
+ */
67
+ async getUser() {
68
+ try {
69
+ const result = await execFileNoThrow('git', ['config', 'user.name']);
70
+ return result.stdout.trim();
71
+ }
72
+ catch {
73
+ return process.env.USER || 'unknown';
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=audit-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/audit-logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAU,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IAKrC,YAAY,WAAmB,EAAE,MAAe;QAF/B,iBAAY,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;QAGvD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,aAAa,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uCAAuC,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAgD;QAChE,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAE5B,0CAA0C;YAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAElC,oBAAoB;YACpB,MAAM,SAAS,GAAkB;gBAC/B,GAAG,KAAK;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,IAAI;aACL,CAAC;YAEF,0BAA0B;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1C,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1C,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAE9C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBAExC,iDAAiD;gBACjD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAE3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;YACrE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC;QACvC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Confirmation Manager - Multi-gate confirmation UX
3
+ * Increment: 0053-safe-feature-deletion
4
+ * Tasks: T-004, T-015, T-017, T-018, T-026
5
+ */
6
+ import { Logger } from '../../utils/logger.js';
7
+ import { ValidationResult, DeletionOptions } from './types.js';
8
+ /**
9
+ * Confirmation Manager - 4-tier safety gates
10
+ * Tier 1: Validation Report (auto-show)
11
+ * Tier 2: Primary Confirmation (y/N)
12
+ * Tier 3: Elevated Confirmation (type "delete" - force mode only)
13
+ * Tier 4: GitHub Confirmation (y/N - if GitHub cleanup needed)
14
+ */
15
+ export declare class ConfirmationManager {
16
+ private logger;
17
+ constructor(logger?: Logger);
18
+ /**
19
+ * T-004, T-015: Get confirmation from user (multi-gate pattern)
20
+ */
21
+ confirm(validation: ValidationResult, options: DeletionOptions): Promise<boolean>;
22
+ /**
23
+ * T-026: GitHub confirmation (separate gate)
24
+ */
25
+ confirmGitHub(issueCount: number, options: DeletionOptions): Promise<boolean>;
26
+ /**
27
+ * T-004: Primary confirmation (y/N)
28
+ */
29
+ private primaryConfirmation;
30
+ /**
31
+ * T-017: Elevated confirmation (type "delete" - force mode)
32
+ */
33
+ private elevatedConfirmation;
34
+ /**
35
+ * Prompt user for input
36
+ */
37
+ private prompt;
38
+ }
39
+ //# sourceMappingURL=confirmation-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/confirmation-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG/D;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IAI3B;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBvF;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAanF;;OAEG;YACW,mBAAmB;IAMjC;;OAEG;YACW,oBAAoB;IAWlC;;OAEG;IACH,OAAO,CAAC,MAAM;CAaf"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Confirmation Manager - Multi-gate confirmation UX
3
+ * Increment: 0053-safe-feature-deletion
4
+ * Tasks: T-004, T-015, T-017, T-018, T-026
5
+ */
6
+ import { consoleLogger } from '../../utils/logger.js';
7
+ import * as readline from 'readline';
8
+ /**
9
+ * Confirmation Manager - 4-tier safety gates
10
+ * Tier 1: Validation Report (auto-show)
11
+ * Tier 2: Primary Confirmation (y/N)
12
+ * Tier 3: Elevated Confirmation (type "delete" - force mode only)
13
+ * Tier 4: GitHub Confirmation (y/N - if GitHub cleanup needed)
14
+ */
15
+ export class ConfirmationManager {
16
+ constructor(logger) {
17
+ this.logger = logger || consoleLogger;
18
+ }
19
+ /**
20
+ * T-004, T-015: Get confirmation from user (multi-gate pattern)
21
+ */
22
+ async confirm(validation, options) {
23
+ // Tier 1: Validation Report (already shown by validator)
24
+ // Tier 2: Primary Confirmation
25
+ if (!options.yes && !options.dryRun) {
26
+ const primaryConfirmed = await this.primaryConfirmation(validation);
27
+ if (!primaryConfirmed) {
28
+ return false;
29
+ }
30
+ }
31
+ // Tier 3: Elevated Confirmation (force mode only)
32
+ if (options.force && !options.dryRun) {
33
+ const elevatedConfirmed = await this.elevatedConfirmation(validation);
34
+ if (!elevatedConfirmed) {
35
+ return false;
36
+ }
37
+ }
38
+ return true;
39
+ }
40
+ /**
41
+ * T-026: GitHub confirmation (separate gate)
42
+ */
43
+ async confirmGitHub(issueCount, options) {
44
+ if (options.noGithub || options.dryRun) {
45
+ return false;
46
+ }
47
+ if (options.yes) {
48
+ return true;
49
+ }
50
+ const answer = await this.prompt(`Close ${issueCount} GitHub issue(s)? (y/N): `);
51
+ return answer.toLowerCase() === 'y';
52
+ }
53
+ /**
54
+ * T-004: Primary confirmation (y/N)
55
+ */
56
+ async primaryConfirmation(validation) {
57
+ const filesCount = validation.files.length;
58
+ const answer = await this.prompt(`Delete feature ${validation.featureId} (${filesCount} files)? (y/N): `);
59
+ return answer.toLowerCase() === 'y';
60
+ }
61
+ /**
62
+ * T-017: Elevated confirmation (type "delete" - force mode)
63
+ */
64
+ async elevatedConfirmation(validation) {
65
+ console.log('');
66
+ console.log('⚠️ WARNING: Force deletion will orphan active increments!');
67
+ console.log(` Affected increments: ${validation.orphanedIncrements.join(', ')}`);
68
+ console.log(` Their metadata will be updated (feature_id removed).`);
69
+ console.log('');
70
+ const answer = await this.prompt('Type "delete" to confirm force deletion: ');
71
+ return answer === 'delete'; // Exact match, case-sensitive
72
+ }
73
+ /**
74
+ * Prompt user for input
75
+ */
76
+ prompt(question) {
77
+ const rl = readline.createInterface({
78
+ input: process.stdin,
79
+ output: process.stdout
80
+ });
81
+ return new Promise((resolve) => {
82
+ rl.question(question, (answer) => {
83
+ rl.close();
84
+ resolve(answer.trim());
85
+ });
86
+ });
87
+ }
88
+ }
89
+ //# sourceMappingURL=confirmation-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation-manager.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/confirmation-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Deletion Transaction with 3-Phase Commit
3
+ * Increment: 0053-safe-feature-deletion
4
+ * Tasks: T-007, T-008, T-009, T-010, T-011
5
+ */
6
+ import { DeletionTransactionOptions, DeletionOptions, DeletionResult, ValidationResult } from './types.js';
7
+ /**
8
+ * Deletion Transaction - Atomic deletion with rollback
9
+ * Implements 3-phase commit: Validation → Staging → Commit
10
+ */
11
+ export declare class DeletionTransaction {
12
+ private projectRoot;
13
+ private logger;
14
+ private gitService;
15
+ private backupDir;
16
+ private checkpointFile;
17
+ constructor(options: DeletionTransactionOptions);
18
+ /**
19
+ * T-010: Execute transaction (3-phase commit)
20
+ */
21
+ execute(validation: ValidationResult, options: DeletionOptions): Promise<DeletionResult>;
22
+ /**
23
+ * T-008, T-010: Phase 2 - Staging (reversible)
24
+ */
25
+ private stagingPhase;
26
+ /**
27
+ * T-010: Phase 3 - Commit (irreversible)
28
+ */
29
+ private commitPhase;
30
+ /**
31
+ * T-011: Rollback (restore from backup)
32
+ */
33
+ private rollback;
34
+ /**
35
+ * T-008: Create backup of files
36
+ */
37
+ private createBackup;
38
+ /**
39
+ * T-008: Create checkpoint file
40
+ */
41
+ private createCheckpoint;
42
+ /**
43
+ * T-009: Update orphaned increment metadata (remove feature_id)
44
+ */
45
+ private updateOrphanedMetadata;
46
+ /**
47
+ * Cleanup backup and checkpoint after successful commit
48
+ */
49
+ private cleanup;
50
+ }
51
+ //# sourceMappingURL=deletion-transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deletion-transaction.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/deletion-transaction.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK3G;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,0BAA0B;IAa/C;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAwB9F;;OAEG;YACW,YAAY;IAsB1B;;OAEG;YACW,WAAW;IA2BzB;;OAEG;YACW,QAAQ;IAyBtB;;OAEG;YACW,YAAY;IAe1B;;OAEG;YACW,gBAAgB;IAgB9B;;OAEG;YACW,sBAAsB;IAqBpC;;OAEG;YACW,OAAO;CAatB"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Deletion Transaction with 3-Phase Commit
3
+ * Increment: 0053-safe-feature-deletion
4
+ * Tasks: T-007, T-008, T-009, T-010, T-011
5
+ */
6
+ import { consoleLogger } from '../../utils/logger.js';
7
+ import { FeatureDeletionGitService } from './git-service.js';
8
+ import fs from 'fs/promises';
9
+ import path from 'path';
10
+ /**
11
+ * Deletion Transaction - Atomic deletion with rollback
12
+ * Implements 3-phase commit: Validation → Staging → Commit
13
+ */
14
+ export class DeletionTransaction {
15
+ constructor(options) {
16
+ this.projectRoot = options.projectRoot;
17
+ this.logger = options.logger || consoleLogger;
18
+ this.gitService = new FeatureDeletionGitService({
19
+ projectRoot: this.projectRoot,
20
+ logger: this.logger
21
+ });
22
+ const timestamp = Date.now();
23
+ this.backupDir = path.join(this.projectRoot, '.specweave/state/deletion-backup', `${timestamp}`);
24
+ this.checkpointFile = path.join(this.projectRoot, '.specweave/state/deletion-checkpoint.json');
25
+ }
26
+ /**
27
+ * T-010: Execute transaction (3-phase commit)
28
+ */
29
+ async execute(validation, options) {
30
+ this.logger.log('Starting deletion transaction (3-phase commit)');
31
+ try {
32
+ // Phase 1: Validation (already done, passed in)
33
+ this.logger.log('Phase 1: Validation - PASSED');
34
+ // Phase 2: Staging (reversible)
35
+ await this.stagingPhase(validation, options);
36
+ // Phase 3: Commit (irreversible)
37
+ const result = await this.commitPhase(validation, options);
38
+ // Cleanup
39
+ await this.cleanup();
40
+ return result;
41
+ }
42
+ catch (error) {
43
+ this.logger.error(`Transaction failed: ${error}`);
44
+ await this.rollback(validation.files);
45
+ throw error;
46
+ }
47
+ }
48
+ /**
49
+ * T-008, T-010: Phase 2 - Staging (reversible)
50
+ */
51
+ async stagingPhase(validation, options) {
52
+ this.logger.log('Phase 2: Staging - Creating backup and staging deletions');
53
+ // T-008: Create backup
54
+ await this.createBackup(validation.files);
55
+ // T-008: Create checkpoint
56
+ await this.createCheckpoint(validation);
57
+ // T-018: Stage git deletions
58
+ if (!options.noGit) {
59
+ await this.gitService.stageGitDeletions(validation.files);
60
+ }
61
+ else {
62
+ // No git - just delete files
63
+ for (const file of validation.files) {
64
+ await fs.unlink(file);
65
+ }
66
+ }
67
+ this.logger.log('Phase 2: Staging - COMPLETE');
68
+ }
69
+ /**
70
+ * T-010: Phase 3 - Commit (irreversible)
71
+ */
72
+ async commitPhase(validation, options) {
73
+ this.logger.log('Phase 3: Commit - Finalizing deletion');
74
+ let commitSha;
75
+ // T-019: Create git commit
76
+ if (!options.noGit) {
77
+ commitSha = await this.gitService.commitDeletion(validation.featureId, validation);
78
+ }
79
+ // T-009: Update orphaned metadata (if force mode)
80
+ if (options.force && validation.orphanedIncrements.length > 0) {
81
+ await this.updateOrphanedMetadata(validation.orphanedIncrements);
82
+ }
83
+ this.logger.log('Phase 3: Commit - COMPLETE');
84
+ return {
85
+ success: true,
86
+ featureId: validation.featureId,
87
+ filesDeleted: validation.files.length,
88
+ commitSha,
89
+ orphanedIncrements: validation.orphanedIncrements,
90
+ warnings: validation.warnings
91
+ };
92
+ }
93
+ /**
94
+ * T-011: Rollback (restore from backup)
95
+ */
96
+ async rollback(files) {
97
+ this.logger.warn('Rolling back transaction...');
98
+ try {
99
+ // Restore files from backup
100
+ for (const file of files) {
101
+ const backupPath = path.join(this.backupDir, path.relative(this.projectRoot, file));
102
+ try {
103
+ await fs.copyFile(backupPath, file);
104
+ }
105
+ catch (error) {
106
+ this.logger.warn(`Failed to restore ${file}: ${error}`);
107
+ }
108
+ }
109
+ // Unstage git deletions
110
+ await this.gitService.unstageGitDeletions(files);
111
+ this.logger.log('Rollback complete. Files restored from backup.');
112
+ }
113
+ catch (error) {
114
+ this.logger.error(`Rollback failed: ${error}`);
115
+ this.logger.error('Backup preserved at: ' + this.backupDir);
116
+ throw error;
117
+ }
118
+ }
119
+ /**
120
+ * T-008: Create backup of files
121
+ */
122
+ async createBackup(files) {
123
+ this.logger.log(`Creating backup at ${this.backupDir}`);
124
+ for (const file of files) {
125
+ const relativePath = path.relative(this.projectRoot, file);
126
+ const backupPath = path.join(this.backupDir, relativePath);
127
+ const backupDirPath = path.dirname(backupPath);
128
+ await fs.mkdir(backupDirPath, { recursive: true });
129
+ await fs.copyFile(file, backupPath);
130
+ }
131
+ this.logger.log(`Backed up ${files.length} files`);
132
+ }
133
+ /**
134
+ * T-008: Create checkpoint file
135
+ */
136
+ async createCheckpoint(validation) {
137
+ const checkpoint = {
138
+ timestamp: new Date().toISOString(),
139
+ featureId: validation.featureId,
140
+ filesCount: validation.files.length,
141
+ backupDir: this.backupDir,
142
+ phase: 'staging'
143
+ };
144
+ const checkpointDir = path.dirname(this.checkpointFile);
145
+ await fs.mkdir(checkpointDir, { recursive: true });
146
+ await fs.writeFile(this.checkpointFile, JSON.stringify(checkpoint, null, 2));
147
+ this.logger.log('Checkpoint created');
148
+ }
149
+ /**
150
+ * T-009: Update orphaned increment metadata (remove feature_id)
151
+ */
152
+ async updateOrphanedMetadata(orphanedIncrements) {
153
+ this.logger.log(`Updating ${orphanedIncrements.length} orphaned increment(s) metadata`);
154
+ for (const incrementId of orphanedIncrements) {
155
+ const metadataPath = path.join(this.projectRoot, '.specweave/increments', incrementId, 'metadata.json');
156
+ try {
157
+ const content = await fs.readFile(metadataPath, 'utf-8');
158
+ const metadata = JSON.parse(content);
159
+ // Remove feature_id field
160
+ delete metadata.feature_id;
161
+ await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));
162
+ this.logger.log(`Updated metadata for ${incrementId}`);
163
+ }
164
+ catch (error) {
165
+ this.logger.warn(`Failed to update metadata for ${incrementId}: ${error}`);
166
+ }
167
+ }
168
+ }
169
+ /**
170
+ * Cleanup backup and checkpoint after successful commit
171
+ */
172
+ async cleanup() {
173
+ try {
174
+ // Remove backup directory
175
+ await fs.rm(this.backupDir, { recursive: true, force: true });
176
+ // Remove checkpoint file
177
+ await fs.unlink(this.checkpointFile);
178
+ this.logger.log('Cleanup complete');
179
+ }
180
+ catch (error) {
181
+ this.logger.warn(`Cleanup failed: ${error}`);
182
+ }
183
+ }
184
+ }
185
+ //# sourceMappingURL=deletion-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deletion-transaction.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/deletion-transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Git Service for Safe Feature Deletion
3
+ * Increment: 0053-safe-feature-deletion
4
+ * Tasks: T-018, T-019, T-020, T-021, T-022, T-023
5
+ */
6
+ import { GitServiceOptions, ValidationResult } from './types.js';
7
+ /**
8
+ * Feature Deletion Git Service
9
+ * Handles git operations for feature deletion
10
+ */
11
+ export declare class FeatureDeletionGitService {
12
+ private projectRoot;
13
+ private logger;
14
+ constructor(options: GitServiceOptions);
15
+ /**
16
+ * T-018, T-023: Stage git deletions (git rm for tracked, fs.unlink for untracked)
17
+ */
18
+ stageGitDeletions(files: string[]): Promise<{
19
+ tracked: number;
20
+ untracked: number;
21
+ }>;
22
+ /**
23
+ * T-019: Create git commit with descriptive message
24
+ */
25
+ commitDeletion(featureId: string, validation: ValidationResult): Promise<string>;
26
+ /**
27
+ * T-021: Unstage git deletions (rollback)
28
+ */
29
+ unstageGitDeletions(files: string[]): Promise<void>;
30
+ /**
31
+ * T-023: Detect git repository
32
+ */
33
+ detectGitRepository(): Promise<boolean>;
34
+ /**
35
+ * Check if file is tracked by git
36
+ */
37
+ private isFileTracked;
38
+ /**
39
+ * Get git user name
40
+ */
41
+ private getGitUser;
42
+ }
43
+ //# sourceMappingURL=git-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-service.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/git-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKjE;;;GAGG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,iBAAiB;IAKtC;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IA4BzF;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BtF;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAU7C;;OAEG;YACW,aAAa;IAS3B;;OAEG;YACW,UAAU;CAQzB"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Git Service for Safe Feature Deletion
3
+ * Increment: 0053-safe-feature-deletion
4
+ * Tasks: T-018, T-019, T-020, T-021, T-022, T-023
5
+ */
6
+ import { consoleLogger } from '../../utils/logger.js';
7
+ import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
8
+ import fs from 'fs/promises';
9
+ import path from 'path';
10
+ /**
11
+ * Feature Deletion Git Service
12
+ * Handles git operations for feature deletion
13
+ */
14
+ export class FeatureDeletionGitService {
15
+ constructor(options) {
16
+ this.projectRoot = options.projectRoot;
17
+ this.logger = options.logger || consoleLogger;
18
+ }
19
+ /**
20
+ * T-018, T-023: Stage git deletions (git rm for tracked, fs.unlink for untracked)
21
+ */
22
+ async stageGitDeletions(files) {
23
+ let tracked = 0;
24
+ let untracked = 0;
25
+ // Check if git repo exists
26
+ const isGitRepo = await this.detectGitRepository();
27
+ if (!isGitRepo) {
28
+ throw new Error('Not a git repository. Use --no-git to skip git operations.');
29
+ }
30
+ for (const file of files) {
31
+ const isTracked = await this.isFileTracked(file);
32
+ if (isTracked) {
33
+ // Use git rm for tracked files
34
+ await execFileNoThrow('git', ['rm', file], { cwd: this.projectRoot });
35
+ tracked++;
36
+ }
37
+ else {
38
+ // Use fs.unlink for untracked files
39
+ await fs.unlink(file);
40
+ untracked++;
41
+ }
42
+ }
43
+ this.logger.log(`Staged ${tracked} tracked files (git rm), ${untracked} untracked files (unlink)`);
44
+ return { tracked, untracked };
45
+ }
46
+ /**
47
+ * T-019: Create git commit with descriptive message
48
+ */
49
+ async commitDeletion(featureId, validation) {
50
+ // Get user from git config
51
+ const user = await this.getGitUser();
52
+ const timestamp = new Date().toISOString();
53
+ const mode = validation.mode;
54
+ // Format commit message
55
+ const message = [
56
+ `feat: delete feature ${featureId}`,
57
+ '',
58
+ `- Deleted ${validation.files.length} files`,
59
+ `- Living docs: ${validation.livingDocsFiles.length}`,
60
+ `- User stories: ${validation.userStoryFiles.length}`,
61
+ validation.orphanedIncrements.length > 0 ? `- Orphaned increments: ${validation.orphanedIncrements.join(', ')} (force mode)` : '',
62
+ '',
63
+ `Deleted by: ${user}`,
64
+ `Timestamp: ${timestamp}`,
65
+ `Mode: ${mode}`
66
+ ].filter(Boolean).join('\n');
67
+ // Create commit
68
+ await execFileNoThrow('git', ['commit', '-m', message], { cwd: this.projectRoot });
69
+ // Get commit SHA
70
+ const result = await execFileNoThrow('git', ['rev-parse', 'HEAD'], { cwd: this.projectRoot });
71
+ const sha = result.stdout.trim();
72
+ this.logger.log(`Created commit ${sha.substring(0, 7)}`);
73
+ return sha;
74
+ }
75
+ /**
76
+ * T-021: Unstage git deletions (rollback)
77
+ */
78
+ async unstageGitDeletions(files) {
79
+ for (const file of files) {
80
+ try {
81
+ await execFileNoThrow('git', ['reset', 'HEAD', '--', file], { cwd: this.projectRoot });
82
+ }
83
+ catch (error) {
84
+ this.logger.warn(`Failed to unstage ${file}: ${error}`);
85
+ }
86
+ }
87
+ this.logger.log(`Unstaged ${files.length} files`);
88
+ }
89
+ /**
90
+ * T-023: Detect git repository
91
+ */
92
+ async detectGitRepository() {
93
+ try {
94
+ const gitDir = path.join(this.projectRoot, '.git');
95
+ await fs.access(gitDir);
96
+ return true;
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ /**
103
+ * Check if file is tracked by git
104
+ */
105
+ async isFileTracked(file) {
106
+ try {
107
+ await execFileNoThrow('git', ['ls-files', '--error-unmatch', file], { cwd: this.projectRoot });
108
+ return true;
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ /**
115
+ * Get git user name
116
+ */
117
+ async getGitUser() {
118
+ try {
119
+ const result = await execFileNoThrow('git', ['config', 'user.name'], { cwd: this.projectRoot });
120
+ return result.stdout.trim();
121
+ }
122
+ catch {
123
+ return process.env.USER || 'unknown';
124
+ }
125
+ }
126
+ }
127
+ //# sourceMappingURL=git-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-service.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/git-service.ts"],"names":[],"mappings":"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"}