sinapse-ai 1.12.2 → 1.14.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 (244) hide show
  1. package/.claude/CLAUDE.md +2 -2
  2. package/.claude/rules/agent-memory-imports.md +4 -0
  3. package/.sinapse-ai/cli/commands/pro/index.js +8 -48
  4. package/.sinapse-ai/constitution.md +6 -2
  5. package/.sinapse-ai/data/entity-registry.yaml +63 -429
  6. package/.sinapse-ai/development/agents/analyst/MEMORY.md +19 -0
  7. package/.sinapse-ai/development/agents/architect/MEMORY.md +52 -0
  8. package/.sinapse-ai/development/agents/data-engineer/MEMORY.md +55 -0
  9. package/.sinapse-ai/development/agents/developer/MEMORY.md +53 -0
  10. package/.sinapse-ai/development/agents/devops/MEMORY.md +56 -0
  11. package/.sinapse-ai/development/agents/product-lead/MEMORY.md +53 -0
  12. package/.sinapse-ai/development/agents/project-lead/MEMORY.md +53 -0
  13. package/.sinapse-ai/development/agents/quality-gate/MEMORY.md +52 -0
  14. package/.sinapse-ai/development/agents/snps-orqx.md +15 -0
  15. package/.sinapse-ai/development/agents/sprint-lead/MEMORY.md +53 -0
  16. package/.sinapse-ai/development/agents/squad-creator.md +15 -0
  17. package/.sinapse-ai/development/agents/ux/MEMORY.md +21 -0
  18. package/.sinapse-ai/development/templates/chrome-brain/knowledge-base/chrome-brain.md +2 -2
  19. package/.sinapse-ai/infrastructure/scripts/ide-sync/index.js +15 -0
  20. package/.sinapse-ai/infrastructure/scripts/validate-agents.js +159 -8
  21. package/.sinapse-ai/install-manifest.yaml +16 -152
  22. package/AGENTS.md +13 -2
  23. package/CHANGELOG.md +135 -3
  24. package/README.en.md +1 -1
  25. package/README.md +6 -26
  26. package/bin/cli.js +2 -7
  27. package/bin/commands/install.js +19 -257
  28. package/bin/commands/update.js +18 -78
  29. package/bin/lib/command-generator.js +261 -0
  30. package/bin/lib/prompts.js +2 -65
  31. package/bin/modules/chrome-brain-installer.js +2 -1
  32. package/bin/postinstall.js +6 -6
  33. package/docs/getting-started.md +0 -1
  34. package/docs/pt/getting-started.md +1 -1
  35. package/docs/security/dependabot-triage.md +17 -17
  36. package/package.json +6 -3
  37. package/packages/installer/src/wizard/i18n.js +3 -204
  38. package/packages/installer/src/wizard/index.js +1 -1
  39. package/packages/installer/src/wizard/questions.js +5 -368
  40. package/packages/installer/src/wizard/wizard.js +0 -9
  41. package/scripts/generate-install-manifest.js +6 -0
  42. package/scripts/validate-changelog-tags.js +97 -0
  43. package/scripts/validate-no-personal-leaks.js +184 -28
  44. package/scripts/validate-schemas.js +55 -10
  45. package/scripts/validate-story-meta.js +25 -12
  46. package/squads/claude-code-mastery/agents/claude-mastery-chief.md +15 -1
  47. package/squads/claude-code-mastery/agents/config-engineer.md +15 -0
  48. package/squads/claude-code-mastery/agents/hooks-architect.md +27 -20
  49. package/squads/claude-code-mastery/agents/mcp-integrator.md +15 -0
  50. package/squads/claude-code-mastery/agents/project-integrator.md +15 -0
  51. package/squads/claude-code-mastery/agents/roadmap-sentinel.md +15 -0
  52. package/squads/claude-code-mastery/agents/skill-craftsman.md +15 -0
  53. package/squads/claude-code-mastery/agents/swarm-orqx.md +15 -0
  54. package/squads/claude-code-mastery/tasks/audit-setup.md +1 -1
  55. package/squads/squad-animations/agents/animation-interpreter.md +15 -0
  56. package/squads/squad-animations/agents/animation-performance-engineer.md +15 -0
  57. package/squads/squad-animations/agents/animations-orqx.md +13 -0
  58. package/squads/squad-animations/agents/css-motion-artist.md +15 -0
  59. package/squads/squad-animations/agents/generative-particle-engineer.md +15 -0
  60. package/squads/squad-animations/agents/motion-choreographer.md +15 -0
  61. package/squads/squad-animations/agents/scroll-narrative-engineer.md +15 -0
  62. package/squads/squad-animations/agents/shader-artist.md +15 -0
  63. package/squads/squad-animations/agents/threejs-architect.md +15 -0
  64. package/squads/squad-brand/agents/brand-archetype-strategist.md +13 -0
  65. package/squads/squad-brand/agents/brand-auditor.md +15 -0
  66. package/squads/squad-brand/agents/brand-collateral-designer.md +15 -0
  67. package/squads/squad-brand/agents/brand-compiler.md +13 -0
  68. package/squads/squad-brand/agents/brand-creative-engineer.md +15 -0
  69. package/squads/squad-brand/agents/brand-culture-architect.md +15 -0
  70. package/squads/squad-brand/agents/brand-growth-strategist.md +15 -0
  71. package/squads/squad-brand/agents/brand-identity-designer.md +15 -0
  72. package/squads/squad-brand/agents/brand-motion-vfx.md +15 -0
  73. package/squads/squad-brand/agents/brand-naming-specialist.md +15 -0
  74. package/squads/squad-brand/agents/brand-orqx.md +13 -0
  75. package/squads/squad-brand/agents/brand-positioning-strategist.md +15 -0
  76. package/squads/squad-brand/agents/brand-sonic-designer.md +15 -0
  77. package/squads/squad-brand/agents/brand-strategist.md +15 -0
  78. package/squads/squad-brand/agents/brand-system-architect.md +15 -0
  79. package/squads/squad-cloning/agents/agent-forger.md +15 -0
  80. package/squads/squad-cloning/agents/cloning-orqx.md +15 -0
  81. package/squads/squad-cloning/agents/cognitive-extractor.md +15 -0
  82. package/squads/squad-cloning/agents/content-capturer.md +15 -0
  83. package/squads/squad-cloning/agents/kb-architect.md +15 -0
  84. package/squads/squad-cloning/agents/mind-synthesizer.md +15 -0
  85. package/squads/squad-cloning/agents/sop-extractor.md +15 -0
  86. package/squads/squad-cloning/agents/source-hunter.md +13 -0
  87. package/squads/squad-cloning/agents/squad-assembler.md +15 -0
  88. package/squads/squad-commercial/agents/commercial-orqx.md +13 -0
  89. package/squads/squad-commercial/agents/cs-business-auditor.md +15 -0
  90. package/squads/squad-commercial/agents/cs-client-success.md +15 -0
  91. package/squads/squad-commercial/agents/cs-crm-specialist.md +15 -0
  92. package/squads/squad-commercial/agents/cs-funnel-architect.md +15 -0
  93. package/squads/squad-commercial/agents/cs-lead-generation-strategist.md +15 -0
  94. package/squads/squad-commercial/agents/cs-offer-designer.md +15 -0
  95. package/squads/squad-commercial/agents/cs-revops-analyst.md +15 -0
  96. package/squads/squad-commercial/agents/cs-sales-closer.md +13 -0
  97. package/squads/squad-commercial/agents/cs-sales-enablement.md +15 -0
  98. package/squads/squad-content/agents/content-analyst.md +13 -0
  99. package/squads/squad-content/agents/content-engineer.md +15 -0
  100. package/squads/squad-content/agents/content-governor.md +13 -0
  101. package/squads/squad-content/agents/content-orqx.md +13 -0
  102. package/squads/squad-content/agents/editorial-strategist.md +15 -0
  103. package/squads/squad-content/agents/platform-specialist.md +15 -0
  104. package/squads/squad-content/agents/signal-intelligence.md +13 -0
  105. package/squads/squad-copy/agents/ad-copywriter.md +13 -0
  106. package/squads/squad-copy/agents/brand-voice-writer.md +15 -0
  107. package/squads/squad-copy/agents/conversion-writer.md +13 -0
  108. package/squads/squad-copy/agents/copy-editor.md +15 -0
  109. package/squads/squad-copy/agents/copy-orqx.md +13 -0
  110. package/squads/squad-copy/agents/copy-strategist.md +15 -0
  111. package/squads/squad-copy/agents/direct-response-writer.md +15 -0
  112. package/squads/squad-copy/agents/email-sequence-strategist.md +15 -0
  113. package/squads/squad-copy/agents/funnel-copywriter.md +15 -0
  114. package/squads/squad-copy/agents/headline-specialist.md +13 -0
  115. package/squads/squad-copy/agents/long-form-writer.md +15 -0
  116. package/squads/squad-copy/agents/persuasion-psychologist.md +15 -0
  117. package/squads/squad-copy/agents/proof-architect.md +15 -0
  118. package/squads/squad-council/agents/brene-brown.md +13 -0
  119. package/squads/squad-council/agents/charlie-munger.md +13 -0
  120. package/squads/squad-council/agents/council-orqx.md +13 -0
  121. package/squads/squad-council/agents/derek-sivers.md +13 -0
  122. package/squads/squad-council/agents/naval-ravikant.md +13 -0
  123. package/squads/squad-council/agents/patrick-lencioni.md +15 -0
  124. package/squads/squad-council/agents/peter-thiel.md +13 -0
  125. package/squads/squad-council/agents/ray-dalio.md +13 -0
  126. package/squads/squad-council/agents/reid-hoffman.md +13 -0
  127. package/squads/squad-council/agents/simon-sinek.md +15 -0
  128. package/squads/squad-council/agents/yvon-chouinard.md +13 -0
  129. package/squads/squad-courses/agents/assessment-creator.md +15 -0
  130. package/squads/squad-courses/agents/content-writer.md +15 -0
  131. package/squads/squad-courses/agents/courses-orqx.md +15 -0
  132. package/squads/squad-courses/agents/curriculum-designer.md +15 -0
  133. package/squads/squad-courses/agents/launch-strategist.md +15 -0
  134. package/squads/squad-courses/agents/lesson-architect.md +15 -0
  135. package/squads/squad-courses/agents/production-director.md +13 -0
  136. package/squads/squad-courses/agents/slide-designer.md +15 -0
  137. package/squads/squad-cybersecurity/agents/cloud-security-engineer.md +15 -0
  138. package/squads/squad-cybersecurity/agents/compliance-officer.md +15 -0
  139. package/squads/squad-cybersecurity/agents/cyber-orqx.md +15 -0
  140. package/squads/squad-cybersecurity/agents/incident-responder.md +15 -0
  141. package/squads/squad-cybersecurity/agents/network-security-engineer.md +15 -0
  142. package/squads/squad-cybersecurity/agents/penetration-tester.md +15 -0
  143. package/squads/squad-cybersecurity/agents/soc-analyst.md +15 -0
  144. package/squads/squad-cybersecurity/agents/threat-analyst.md +15 -0
  145. package/squads/squad-design/agents/cro-persuasion.md +15 -0
  146. package/squads/squad-design/agents/design-orqx.md +13 -0
  147. package/squads/squad-design/agents/design-system.md +15 -0
  148. package/squads/squad-design/agents/dx-accessibility-specialist.md +15 -0
  149. package/squads/squad-design/agents/dx-design-system-architect.md +15 -0
  150. package/squads/squad-design/agents/dx-frontend-engineer.md +15 -0
  151. package/squads/squad-design/agents/dx-interaction-designer.md +15 -0
  152. package/squads/squad-design/agents/dx-performance-engineer.md +15 -0
  153. package/squads/squad-design/agents/dx-ui-designer.md +15 -0
  154. package/squads/squad-design/agents/dx-ux-strategist.md +15 -0
  155. package/squads/squad-design/agents/platform-aesthetic-director.md +15 -0
  156. package/squads/squad-design/agents/premium-packaging-strategist.md +15 -0
  157. package/squads/squad-design/agents/product-surface-director.md +15 -0
  158. package/squads/squad-design/agents/ux-designer.md +15 -0
  159. package/squads/squad-finance/agents/budget-controller.md +15 -0
  160. package/squads/squad-finance/agents/cost-optimizer.md +15 -0
  161. package/squads/squad-finance/agents/finance-orqx.md +15 -0
  162. package/squads/squad-finance/agents/fiscal-compliance-br.md +15 -0
  163. package/squads/squad-finance/agents/forecast-strategist.md +15 -0
  164. package/squads/squad-finance/agents/pricing-strategist.md +15 -0
  165. package/squads/squad-finance/agents/profitability-analyst.md +15 -0
  166. package/squads/squad-finance/agents/revenue-analyst.md +15 -0
  167. package/squads/squad-growth/agents/ga-analytics-engineer.md +15 -0
  168. package/squads/squad-growth/agents/ga-campaign-analyst.md +15 -0
  169. package/squads/squad-growth/agents/ga-cro-specialist.md +15 -0
  170. package/squads/squad-growth/agents/ga-data-analyst.md +13 -0
  171. package/squads/squad-growth/agents/ga-growth-hacker.md +15 -0
  172. package/squads/squad-growth/agents/ga-seo-strategist.md +15 -0
  173. package/squads/squad-growth/agents/growth-orqx.md +15 -0
  174. package/squads/squad-paidmedia/agents/campaign-analyst.md +15 -0
  175. package/squads/squad-paidmedia/agents/creative-strategist.md +15 -0
  176. package/squads/squad-paidmedia/agents/cro-specialist.md +15 -0
  177. package/squads/squad-paidmedia/agents/google-ads-specialist.md +15 -0
  178. package/squads/squad-paidmedia/agents/meta-ads-specialist.md +15 -0
  179. package/squads/squad-paidmedia/agents/paidmedia-orqx.md +15 -0
  180. package/squads/squad-paidmedia/agents/performance-engineer.md +15 -0
  181. package/squads/squad-paidmedia/agents/pm-creative-performance-analyst.md +15 -0
  182. package/squads/squad-paidmedia/agents/pm-youtube-ads-specialist.md +15 -0
  183. package/squads/squad-product/agents/product-orqx.md +13 -1
  184. package/squads/squad-product/agents/ps-client-product-manager.md +13 -1
  185. package/squads/squad-product/agents/ps-delivery-manager.md +13 -1
  186. package/squads/squad-product/agents/ps-discovery-lead.md +15 -1
  187. package/squads/squad-product/agents/ps-product-analyst.md +15 -1
  188. package/squads/squad-product/agents/ps-product-ops-specialist.md +15 -1
  189. package/squads/squad-product/agents/ps-product-strategist.md +15 -1
  190. package/squads/squad-research/agents/audience-intelligence.md +15 -0
  191. package/squads/squad-research/agents/competitive-intelligence.md +15 -0
  192. package/squads/squad-research/agents/data-synthesizer.md +15 -0
  193. package/squads/squad-research/agents/deep-researcher.md +15 -0
  194. package/squads/squad-research/agents/market-analyst.md +15 -0
  195. package/squads/squad-research/agents/research-orqx.md +15 -0
  196. package/squads/squad-research/agents/trend-forecaster.md +15 -0
  197. package/squads/squad-storytelling/agents/blake-snyder.md +13 -0
  198. package/squads/squad-storytelling/agents/dan-harmon.md +13 -0
  199. package/squads/squad-storytelling/agents/joseph-campbell.md +13 -0
  200. package/squads/squad-storytelling/agents/keith-johnstone.md +13 -0
  201. package/squads/squad-storytelling/agents/kindra-hall.md +15 -0
  202. package/squads/squad-storytelling/agents/marshall-ganz.md +15 -0
  203. package/squads/squad-storytelling/agents/nancy-duarte.md +15 -0
  204. package/squads/squad-storytelling/agents/oren-klaff.md +15 -0
  205. package/squads/squad-storytelling/agents/park-howell.md +13 -0
  206. package/squads/squad-storytelling/agents/storytelling-orqx.md +13 -0
  207. package/.sinapse-ai/core/grounding/README.md +0 -83
  208. package/.sinapse-ai/core/grounding/brand.cjs +0 -29
  209. package/.sinapse-ai/core/grounding/config-loader.cjs +0 -52
  210. package/.sinapse-ai/core/grounding/design-system.cjs +0 -29
  211. package/.sinapse-ai/core/grounding/vault.cjs +0 -36
  212. package/.sinapse-ai/development/scripts/approval-workflow.js +0 -643
  213. package/.sinapse-ai/development/scripts/backup-manager.js +0 -607
  214. package/.sinapse-ai/development/scripts/branch-manager.js +0 -390
  215. package/.sinapse-ai/development/scripts/code-quality-improver.js +0 -1329
  216. package/.sinapse-ai/development/scripts/commit-message-generator.js +0 -850
  217. package/.sinapse-ai/development/scripts/conflict-resolver.js +0 -675
  218. package/.sinapse-ai/development/scripts/dependency-analyzer.js +0 -638
  219. package/.sinapse-ai/development/scripts/diff-generator.js +0 -352
  220. package/.sinapse-ai/development/scripts/git-wrapper.js +0 -462
  221. package/.sinapse-ai/development/scripts/modification-validator.js +0 -555
  222. package/.sinapse-ai/development/scripts/performance-analyzer.js +0 -758
  223. package/.sinapse-ai/development/scripts/refactoring-suggester.js +0 -1148
  224. package/.sinapse-ai/development/scripts/rollback-handler.js +0 -531
  225. package/.sinapse-ai/development/scripts/security-checker.js +0 -359
  226. package/.sinapse-ai/development/scripts/template-engine.js +0 -240
  227. package/.sinapse-ai/development/scripts/template-validator.js +0 -279
  228. package/.sinapse-ai/development/scripts/test-generator.js +0 -844
  229. package/.sinapse-ai/development/scripts/transaction-manager.js +0 -590
  230. package/.sinapse-ai/development/scripts/yaml-validator.js +0 -397
  231. package/.sinapse-ai/hooks/sinapse-brand-grounding.cjs +0 -162
  232. package/.sinapse-ai/hooks/sinapse-ds-grounding.cjs +0 -211
  233. package/.sinapse-ai/hooks/sinapse-vault-grounding.cjs +0 -194
  234. package/bin/lib/register-grounding-hooks.js +0 -145
  235. package/docs/guides/agents/traces/execution-traces.zip +0 -0
  236. package/docs/guides/grounding-setup.md +0 -154
  237. package/docs/guides/workflows/SINAPSE-WORKFLOWS.zip +0 -0
  238. package/packages/installer/src/pro/pro-scaffolder.js +0 -449
  239. package/packages/installer/src/wizard/grounding-config.js +0 -131
  240. package/packages/installer/src/wizard/pro-setup.js +0 -1439
  241. package/packages/installer/templates/README.md +0 -16
  242. package/packages/installer/templates/brand-routing.example.json +0 -12
  243. package/packages/installer/templates/ds-routing.example.json +0 -12
  244. package/packages/installer/templates/vault-routing.example.json +0 -12
@@ -1,531 +0,0 @@
1
- /**
2
- * Rollback Handler for SINAPSE-FULLSTACK
3
- * Handles undo operations for component transactions
4
- * @module rollback-handler
5
- */
6
-
7
- const TransactionManager = require('./transaction-manager');
8
- const chalk = require('chalk');
9
- const inquirer = require('inquirer');
10
- const path = require('path');
11
- const fs = require('fs').promises;
12
- const ModificationValidator = require('./modification-validator');
13
-
14
- class RollbackHandler {
15
- constructor(options = {}) {
16
- this.rootPath = options.rootPath || process.cwd();
17
- this.transactionManager = new TransactionManager({ rootPath: this.rootPath });
18
- this.modificationValidator = new ModificationValidator();
19
- this.backupPath = path.join(this.rootPath, 'sinapse-ai', '.backups');
20
- }
21
-
22
- /**
23
- * Execute undo-last command
24
- * @param {Object} options - Rollback options
25
- * @returns {Promise<Object>} Rollback result
26
- */
27
- async undoLast(options = {}) {
28
- try {
29
- let transaction;
30
-
31
- if (options.transactionId) {
32
- // Load specific transaction
33
- transaction = await this.transactionManager.loadTransaction(options.transactionId);
34
- if (!transaction) {
35
- throw new Error(`Transaction not found: ${options.transactionId}`);
36
- }
37
- } else {
38
- // Get last transaction
39
- transaction = await this.transactionManager.getLastTransaction();
40
- if (!transaction) {
41
- console.log(chalk.yellow('No transactions found to rollback'));
42
- return { success: false, error: 'No transactions found' };
43
- }
44
- }
45
-
46
- // Display transaction details
47
- console.log(chalk.blue('\n📋 Transaction Details:'));
48
- console.log(chalk.gray(`ID: ${transaction.id}`));
49
- console.log(chalk.gray(`Type: ${transaction.type}`));
50
- console.log(chalk.gray(`Date: ${new Date(transaction.startTime).toLocaleString()}`));
51
- console.log(chalk.gray(`Status: ${transaction.status}`));
52
- console.log(chalk.gray(`Operations: ${transaction.operations.length}`));
53
-
54
- // Show operations
55
- console.log(chalk.blue('\n📝 Operations to rollback:'));
56
- for (const op of transaction.operations) {
57
- const icon = this.getOperationIcon(op.type);
58
- console.log(chalk.gray(` ${icon} ${op.type}: ${path.basename(op.path)}`));
59
- }
60
-
61
- // Confirm rollback
62
- if (!options.force) {
63
- const { confirm } = await inquirer.prompt([{
64
- type: 'confirm',
65
- name: 'confirm',
66
- message: 'Do you want to rollback this transaction?',
67
- default: true
68
- }]);
69
-
70
- if (!confirm) {
71
- console.log(chalk.yellow('Rollback cancelled'));
72
- return { success: false, error: 'User cancelled' };
73
- }
74
- }
75
-
76
- // Execute rollback
77
- console.log(chalk.blue('\n⚙️ Executing rollback...'));
78
-
79
- const rollbackResult = await this.transactionManager.rollbackTransaction(
80
- transaction.id,
81
- {
82
- continueOnError: options.continueOnError !== false
83
- }
84
- );
85
-
86
- // Display results
87
- this.displayRollbackResults(rollbackResult);
88
-
89
- return {
90
- success: rollbackResult.failed.length === 0,
91
- result: rollbackResult
92
- };
93
-
94
- } catch (error) {
95
- console.error(chalk.red(`\n❌ Rollback failed: ${error.message}`));
96
- return {
97
- success: false,
98
- error: error.message
99
- };
100
- }
101
- }
102
-
103
- /**
104
- * List recent transactions
105
- * @param {number} limit - Number of transactions to show
106
- * @returns {Promise<void>}
107
- */
108
- async listTransactions(limit = 10) {
109
- try {
110
- const transactions = await this.transactionManager.listTransactions(limit);
111
-
112
- if (transactions.length === 0) {
113
- console.log(chalk.yellow('No transactions found'));
114
- return;
115
- }
116
-
117
- console.log(chalk.blue('\n📋 Recent Transactions:'));
118
- console.log(chalk.gray('─'.repeat(80)));
119
-
120
- for (const txn of transactions) {
121
- const date = new Date(txn.startTime).toLocaleString();
122
- const duration = txn.endTime
123
- ? `${new Date(txn.endTime) - new Date(txn.startTime)}ms`
124
- : 'active';
125
-
126
- console.log(chalk.white(`\nID: ${txn.id}`));
127
- console.log(chalk.gray(`Type: ${txn.type}`));
128
- console.log(chalk.gray(`Description: ${txn.description}`));
129
- console.log(chalk.gray(`User: ${txn.user}`));
130
- console.log(chalk.gray(`Date: ${date}`));
131
- console.log(chalk.gray(`Status: ${this.getStatusColor(txn.status)}`));
132
- console.log(chalk.gray(`Operations: ${txn.operations}`));
133
- console.log(chalk.gray(`Duration: ${duration}`));
134
- console.log(chalk.gray('─'.repeat(80)));
135
- }
136
-
137
- } catch (error) {
138
- console.error(chalk.red(`Failed to list transactions: ${error.message}`));
139
- }
140
- }
141
-
142
- /**
143
- * Execute selective rollback
144
- * @param {string} transactionId - Transaction ID
145
- * @param {Array<string>} operationIds - Specific operations to rollback
146
- * @returns {Promise<Object>} Rollback result
147
- */
148
- async selectiveRollback(transactionId, operationIds) {
149
- try {
150
- const transaction = await this.transactionManager.loadTransaction(transactionId);
151
- if (!transaction) {
152
- throw new Error(`Transaction not found: ${transactionId}`);
153
- }
154
-
155
- // Filter operations
156
- const selectedOps = transaction.operations.filter(op =>
157
- operationIds.includes(op.id)
158
- );
159
-
160
- if (selectedOps.length === 0) {
161
- throw new Error('No matching operations found');
162
- }
163
-
164
- console.log(chalk.blue(`\n📝 Selective rollback: ${selectedOps.length} operations`));
165
-
166
- // Create a new transaction for selective rollback
167
- const rollbackTxnId = await this.transactionManager.beginTransaction({
168
- type: 'selective_rollback',
169
- description: `Selective rollback of ${transactionId}`,
170
- metadata: {
171
- originalTransaction: transactionId,
172
- selectedOperations: operationIds
173
- }
174
- });
175
-
176
- const results = {
177
- successful: [],
178
- failed: [],
179
- warnings: []
180
- };
181
-
182
- // Rollback selected operations
183
- for (const op of selectedOps) {
184
- try {
185
- await this.transactionManager.rollbackOperation(op, results);
186
- } catch (error) {
187
- results.failed.push({
188
- operation: op.id,
189
- error: error.message
190
- });
191
- }
192
- }
193
-
194
- // Commit rollback transaction
195
- await this.transactionManager.commitTransaction(rollbackTxnId);
196
-
197
- this.displayRollbackResults(results);
198
-
199
- return {
200
- success: results.failed.length === 0,
201
- result: results
202
- };
203
-
204
- } catch (error) {
205
- console.error(chalk.red(`Selective rollback failed: ${error.message}`));
206
- return {
207
- success: false,
208
- error: error.message
209
- };
210
- }
211
- }
212
-
213
- /**
214
- * Clean up old transactions
215
- * @returns {Promise<number>} Number cleaned
216
- */
217
- async cleanup() {
218
- try {
219
- console.log(chalk.blue('🧹 Cleaning up old transactions...'));
220
- const cleaned = await this.transactionManager.cleanupOldTransactions();
221
- console.log(chalk.green(`✅ Cleaned up ${cleaned} old transactions`));
222
- return cleaned;
223
- } catch (error) {
224
- console.error(chalk.red(`Cleanup failed: ${error.message}`));
225
- return 0;
226
- }
227
- }
228
-
229
- /**
230
- * Create backup before modification
231
- * @param {string} componentType - Type of component
232
- * @param {string} componentName - Name of component
233
- * @param {string} content - Content to backup
234
- * @returns {Promise<string>} Backup file path
235
- */
236
- async createBackup(componentType, componentName, content) {
237
- try {
238
- // Ensure backup directory exists
239
- await fs.mkdir(this.backupPath, { recursive: true });
240
-
241
- // Create subdirectory for component type
242
- const typeBackupPath = path.join(this.backupPath, componentType);
243
- await fs.mkdir(typeBackupPath, { recursive: true });
244
-
245
- // Generate backup filename with timestamp
246
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
247
- const backupFilename = `${componentName}.${timestamp}.backup`;
248
- const backupFilePath = path.join(typeBackupPath, backupFilename);
249
-
250
- // Write backup
251
- await fs.writeFile(backupFilePath, content, 'utf8');
252
-
253
- // Record backup in transaction
254
- if (this.currentTransactionId) {
255
- await this.transactionManager.recordOperation({
256
- type: 'backup_created',
257
- path: backupFilePath,
258
- componentType,
259
- componentName,
260
- timestamp
261
- });
262
- }
263
-
264
- return backupFilePath;
265
- } catch (error) {
266
- throw new Error(`Failed to create backup: ${error.message}`);
267
- }
268
- }
269
-
270
- /**
271
- * Restore from backup
272
- * @param {string} backupPath - Path to backup file
273
- * @param {string} targetPath - Path to restore to
274
- * @returns {Promise<boolean>} Success status
275
- */
276
- async restoreFromBackup(backupPath, targetPath) {
277
- try {
278
- // Verify backup exists
279
- await fs.access(backupPath);
280
-
281
- // Read backup content
282
- const content = await fs.readFile(backupPath, 'utf8');
283
-
284
- // Restore to target
285
- await fs.writeFile(targetPath, content, 'utf8');
286
-
287
- console.log(chalk.green(`✅ Restored from backup: ${path.basename(backupPath)}`));
288
- return true;
289
- } catch (error) {
290
- console.error(chalk.red(`Failed to restore from backup: ${error.message}`));
291
- return false;
292
- }
293
- }
294
-
295
- /**
296
- * Validate modification before applying
297
- * @param {string} componentType - Type of component
298
- * @param {string} originalContent - Original content
299
- * @param {string} modifiedContent - Modified content
300
- * @returns {Promise<Object>} Validation result
301
- */
302
- async validateModification(componentType, originalContent, modifiedContent) {
303
- const validation = await this.modificationValidator.validateModification(
304
- componentType,
305
- originalContent,
306
- modifiedContent
307
- );
308
-
309
- if (!validation.valid) {
310
- console.log(chalk.red('\n❌ Modification validation failed:'));
311
- validation.errors.forEach(error => {
312
- console.log(chalk.red(` • ${error}`));
313
- });
314
- }
315
-
316
- if (validation.warnings.length > 0) {
317
- console.log(chalk.yellow('\n⚠️ Warnings:'));
318
- validation.warnings.forEach(warning => {
319
- console.log(chalk.yellow(` • ${warning}`));
320
- });
321
- }
322
-
323
- if (validation.breakingChanges.length > 0) {
324
- console.log(chalk.red('\n🚨 Breaking Changes Detected:'));
325
- validation.breakingChanges.forEach(change => {
326
- console.log(chalk.red(` • ${change.type}: ${change.impact}`));
327
- if (change.items) {
328
- console.log(chalk.red(` Items: ${change.items.join(', ')}`));
329
- }
330
- });
331
- }
332
-
333
- return validation;
334
- }
335
-
336
- /**
337
- * Rollback modification
338
- * @param {Object} modificationData - Modification details
339
- * @returns {Promise<Object>} Rollback result
340
- */
341
- async rollbackModification(modificationData) {
342
- const { componentType, componentName, backupPath, targetPath } = modificationData;
343
-
344
- try {
345
- console.log(chalk.blue(`\n⏪ Rolling back ${componentType}: ${componentName}`));
346
-
347
- // Restore from backup
348
- const restored = await this.restoreFromBackup(backupPath, targetPath);
349
-
350
- if (restored) {
351
- // Record rollback
352
- await this.transactionManager.recordOperation({
353
- type: 'modification_rollback',
354
- componentType,
355
- componentName,
356
- backupPath,
357
- targetPath,
358
- timestamp: new Date().toISOString()
359
- });
360
-
361
- return {
362
- success: true,
363
- message: `Successfully rolled back ${componentType}: ${componentName}`
364
- };
365
- } else {
366
- throw new Error('Restoration failed');
367
- }
368
- } catch (error) {
369
- return {
370
- success: false,
371
- error: error.message
372
- };
373
- }
374
- }
375
-
376
- /**
377
- * List available backups for a component
378
- * @param {string} componentType - Type of component
379
- * @param {string} componentName - Name of component
380
- * @returns {Promise<Array>} List of backups
381
- */
382
- async listBackups(componentType, componentName) {
383
- try {
384
- const typeBackupPath = path.join(this.backupPath, componentType);
385
- const files = await fs.readdir(typeBackupPath);
386
-
387
- const backups = files
388
- .filter(file => file.startsWith(`${componentName}.`) && file.endsWith('.backup'))
389
- .map(file => {
390
- const match = file.match(/\.(\d{4}-\d{2}-\d{2}T[\d-]+Z)\.backup$/);
391
- const timestamp = match ? match[1].replace(/-/g, ':') : 'unknown';
392
-
393
- return {
394
- filename: file,
395
- path: path.join(typeBackupPath, file),
396
- timestamp: new Date(timestamp),
397
- componentName,
398
- componentType
399
- };
400
- })
401
- .sort((a, b) => b.timestamp - a.timestamp);
402
-
403
- return backups;
404
- } catch (error) {
405
- if (error.code === 'ENOENT') {
406
- return [];
407
- }
408
- throw error;
409
- }
410
- }
411
-
412
- /**
413
- * Clean up old backups
414
- * @param {number} daysToKeep - Number of days to keep backups
415
- * @returns {Promise<number>} Number of backups deleted
416
- */
417
- async cleanupBackups(daysToKeep = 30) {
418
- try {
419
- const cutoffDate = new Date();
420
- cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);
421
-
422
- let deletedCount = 0;
423
-
424
- // Iterate through component types
425
- const componentTypes = await fs.readdir(this.backupPath);
426
-
427
- for (const componentType of componentTypes) {
428
- const typePath = path.join(this.backupPath, componentType);
429
- const stat = await fs.stat(typePath);
430
-
431
- if (!stat.isDirectory()) continue;
432
-
433
- const files = await fs.readdir(typePath);
434
-
435
- for (const file of files) {
436
- if (!file.endsWith('.backup')) continue;
437
-
438
- const filePath = path.join(typePath, file);
439
- const fileStat = await fs.stat(filePath);
440
-
441
- if (fileStat.mtime < cutoffDate) {
442
- await fs.unlink(filePath);
443
- deletedCount++;
444
- }
445
- }
446
- }
447
-
448
- return deletedCount;
449
- } catch (error) {
450
- console.error(chalk.red(`Backup cleanup failed: ${error.message}`));
451
- return 0;
452
- }
453
- }
454
-
455
- /**
456
- * Get operation icon
457
- * @private
458
- */
459
- getOperationIcon(type) {
460
- const icons = {
461
- create: '➕',
462
- update: '✏️',
463
- delete: '🗑️',
464
- manifest_update: '📋',
465
- metadata_update: '📊',
466
- component_created: '📦',
467
- backup_created: '💾',
468
- modification_rollback: '⏪'
469
- };
470
-
471
- return icons[type] || '•';
472
- }
473
-
474
- /**
475
- * Get status color
476
- * @private
477
- */
478
- getStatusColor(status) {
479
- switch (status) {
480
- case 'active':
481
- return chalk.yellow(status);
482
- case 'committed':
483
- return chalk.green(status);
484
- case 'rolled_back':
485
- return chalk.blue(status);
486
- case 'failed':
487
- return chalk.red(status);
488
- default:
489
- return status;
490
- }
491
- }
492
-
493
- /**
494
- * Display rollback results
495
- * @private
496
- */
497
- displayRollbackResults(results) {
498
- console.log(chalk.blue('\n📊 Rollback Results:'));
499
-
500
- if (results.successful.length > 0) {
501
- console.log(chalk.green(`\n✅ Successful (${results.successful.length}):`));
502
- results.successful.forEach(item => {
503
- console.log(chalk.green(` ✓ ${item.action}: ${path.basename(item.path)}`));
504
- });
505
- }
506
-
507
- if (results.warnings.length > 0) {
508
- console.log(chalk.yellow(`\n⚠️ Warnings (${results.warnings.length}):`));
509
- results.warnings.forEach(item => {
510
- console.log(chalk.yellow(` ⚠ ${item.warning}: ${path.basename(item.path || 'N/A')}`));
511
- });
512
- }
513
-
514
- if (results.failed.length > 0) {
515
- console.log(chalk.red(`\n❌ Failed (${results.failed.length}):`));
516
- results.failed.forEach(item => {
517
- console.log(chalk.red(` ✗ ${item.operation}: ${item.error}`));
518
- });
519
- }
520
-
521
- // Summary
522
- const total = results.successful.length + results.failed.length;
523
- const successRate = total > 0 ? (results.successful.length / total * 100).toFixed(0) : 0;
524
-
525
- console.log(chalk.blue('\n📈 Summary:'));
526
- console.log(chalk.gray(` Total operations: ${total}`));
527
- console.log(chalk.gray(` Success rate: ${successRate}%`));
528
- }
529
- }
530
-
531
- module.exports = RollbackHandler;