@wundr.io/cli 1.0.10 → 1.0.12

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 (269) hide show
  1. package/bin/wundr.js +8 -4
  2. package/package.json +23 -23
  3. package/src/ai/ai-service.ts +16 -17
  4. package/src/ai/claude-client.ts +16 -16
  5. package/src/ai/conversation-manager.ts +29 -29
  6. package/src/cli.ts +4 -4
  7. package/src/commands/ai.ts +246 -78
  8. package/src/commands/alignment.ts +74 -74
  9. package/src/commands/analyze-optimized.ts +111 -78
  10. package/src/commands/analyze.ts +14 -14
  11. package/src/commands/batch.ts +179 -42
  12. package/src/commands/chat.ts +37 -30
  13. package/src/commands/claude-init.ts +41 -45
  14. package/src/commands/claude-setup.ts +204 -119
  15. package/src/commands/computer-setup.ts +85 -43
  16. package/src/commands/create-command.ts +4 -4
  17. package/src/commands/create.ts +27 -27
  18. package/src/commands/dashboard.ts +24 -24
  19. package/src/commands/govern.ts +25 -25
  20. package/src/commands/governance.ts +34 -34
  21. package/src/commands/guardian.ts +56 -56
  22. package/src/commands/init.ts +25 -22
  23. package/src/commands/orchestrator.ts +68 -41
  24. package/src/commands/performance-optimizer.ts +34 -35
  25. package/src/commands/plugins.ts +27 -27
  26. package/src/commands/project-update.ts +175 -72
  27. package/src/commands/rag.ts +185 -78
  28. package/src/commands/session.ts +35 -35
  29. package/src/commands/setup.ts +40 -344
  30. package/src/commands/test-init.ts +3 -3
  31. package/src/commands/test.ts +4 -4
  32. package/src/commands/watch.ts +28 -29
  33. package/src/commands/worktree.ts +49 -49
  34. package/src/context/context-manager.ts +10 -10
  35. package/src/context/session-manager.ts +41 -41
  36. package/src/framework/command-interface.ts +520 -0
  37. package/src/framework/command-registry.ts +942 -0
  38. package/src/framework/completion-exporter.ts +383 -0
  39. package/src/framework/debug-logger.ts +519 -0
  40. package/src/framework/error-handler.ts +867 -0
  41. package/src/framework/help-generator.ts +540 -0
  42. package/src/framework/index.ts +169 -0
  43. package/src/framework/interactive-repl.ts +703 -0
  44. package/src/framework/output-formatter.ts +834 -0
  45. package/src/framework/progress-manager.ts +539 -0
  46. package/src/index.ts +4 -4
  47. package/src/interactive/interactive-mode.ts +16 -16
  48. package/src/lib/conflict-resolution.ts +799 -9
  49. package/src/lib/merge-strategy.ts +529 -7
  50. package/src/lib/safety-mechanisms.ts +422 -18
  51. package/src/lib/state-detection.ts +1015 -13
  52. package/src/nlp/command-mapper.ts +29 -29
  53. package/src/nlp/command-parser.ts +17 -17
  54. package/src/nlp/intent-classifier.ts +7 -7
  55. package/src/nlp/intent-parser.ts +54 -52
  56. package/src/plugins/plugin-manager.ts +61 -39
  57. package/src/tests/computer-setup-integration.test.ts +46 -15
  58. package/src/types/modules.d.ts +424 -1
  59. package/src/utils/backup-rollback-manager.ts +11 -8
  60. package/src/utils/config-manager.ts +3 -3
  61. package/src/utils/error-handler.ts +2 -2
  62. package/src/utils/logger.ts +22 -22
  63. package/templates/batch/ci-cd.yaml +7 -7
  64. package/test-suites/api/health.spec.ts +20 -23
  65. package/test-suites/helpers/test-config.ts +14 -13
  66. package/test-suites/ui/accessibility.spec.ts +27 -22
  67. package/test-suites/ui/smoke.spec.ts +26 -21
  68. package/LICENSE +0 -21
  69. package/dist/ai/ai-service.d.ts +0 -152
  70. package/dist/ai/ai-service.d.ts.map +0 -1
  71. package/dist/ai/ai-service.js +0 -430
  72. package/dist/ai/ai-service.js.map +0 -1
  73. package/dist/ai/claude-client.d.ts +0 -130
  74. package/dist/ai/claude-client.d.ts.map +0 -1
  75. package/dist/ai/claude-client.js +0 -340
  76. package/dist/ai/claude-client.js.map +0 -1
  77. package/dist/ai/conversation-manager.d.ts +0 -164
  78. package/dist/ai/conversation-manager.d.ts.map +0 -1
  79. package/dist/ai/conversation-manager.js +0 -614
  80. package/dist/ai/conversation-manager.js.map +0 -1
  81. package/dist/ai/index.d.ts +0 -5
  82. package/dist/ai/index.d.ts.map +0 -1
  83. package/dist/ai/index.js +0 -8
  84. package/dist/ai/index.js.map +0 -1
  85. package/dist/cli.d.ts +0 -36
  86. package/dist/cli.d.ts.map +0 -1
  87. package/dist/cli.js +0 -192
  88. package/dist/cli.js.map +0 -1
  89. package/dist/commands/ai.d.ts +0 -89
  90. package/dist/commands/ai.d.ts.map +0 -1
  91. package/dist/commands/ai.js +0 -799
  92. package/dist/commands/ai.js.map +0 -1
  93. package/dist/commands/alignment.d.ts +0 -78
  94. package/dist/commands/alignment.d.ts.map +0 -1
  95. package/dist/commands/alignment.js +0 -817
  96. package/dist/commands/alignment.js.map +0 -1
  97. package/dist/commands/analyze-optimized.d.ts +0 -14
  98. package/dist/commands/analyze-optimized.d.ts.map +0 -1
  99. package/dist/commands/analyze-optimized.js +0 -600
  100. package/dist/commands/analyze-optimized.js.map +0 -1
  101. package/dist/commands/analyze.d.ts +0 -65
  102. package/dist/commands/analyze.d.ts.map +0 -1
  103. package/dist/commands/analyze.js +0 -435
  104. package/dist/commands/analyze.js.map +0 -1
  105. package/dist/commands/batch.d.ts +0 -71
  106. package/dist/commands/batch.d.ts.map +0 -1
  107. package/dist/commands/batch.js +0 -738
  108. package/dist/commands/batch.js.map +0 -1
  109. package/dist/commands/chat.d.ts +0 -71
  110. package/dist/commands/chat.d.ts.map +0 -1
  111. package/dist/commands/chat.js +0 -674
  112. package/dist/commands/chat.js.map +0 -1
  113. package/dist/commands/claude-init.d.ts +0 -28
  114. package/dist/commands/claude-init.d.ts.map +0 -1
  115. package/dist/commands/claude-init.js +0 -591
  116. package/dist/commands/claude-init.js.map +0 -1
  117. package/dist/commands/claude-setup.d.ts +0 -119
  118. package/dist/commands/claude-setup.d.ts.map +0 -1
  119. package/dist/commands/claude-setup.js +0 -1073
  120. package/dist/commands/claude-setup.js.map +0 -1
  121. package/dist/commands/computer-setup-commands.d.ts +0 -53
  122. package/dist/commands/computer-setup-commands.d.ts.map +0 -1
  123. package/dist/commands/computer-setup-commands.js +0 -705
  124. package/dist/commands/computer-setup-commands.js.map +0 -1
  125. package/dist/commands/computer-setup.d.ts +0 -7
  126. package/dist/commands/computer-setup.d.ts.map +0 -1
  127. package/dist/commands/computer-setup.js +0 -849
  128. package/dist/commands/computer-setup.js.map +0 -1
  129. package/dist/commands/create-command.d.ts +0 -7
  130. package/dist/commands/create-command.d.ts.map +0 -1
  131. package/dist/commands/create-command.js +0 -158
  132. package/dist/commands/create-command.js.map +0 -1
  133. package/dist/commands/create.d.ts +0 -74
  134. package/dist/commands/create.d.ts.map +0 -1
  135. package/dist/commands/create.js +0 -556
  136. package/dist/commands/create.js.map +0 -1
  137. package/dist/commands/dashboard.d.ts +0 -91
  138. package/dist/commands/dashboard.d.ts.map +0 -1
  139. package/dist/commands/dashboard.js +0 -538
  140. package/dist/commands/dashboard.js.map +0 -1
  141. package/dist/commands/govern.d.ts +0 -70
  142. package/dist/commands/govern.d.ts.map +0 -1
  143. package/dist/commands/govern.js +0 -481
  144. package/dist/commands/govern.js.map +0 -1
  145. package/dist/commands/governance.d.ts +0 -17
  146. package/dist/commands/governance.d.ts.map +0 -1
  147. package/dist/commands/governance.js +0 -703
  148. package/dist/commands/governance.js.map +0 -1
  149. package/dist/commands/guardian.d.ts +0 -20
  150. package/dist/commands/guardian.d.ts.map +0 -1
  151. package/dist/commands/guardian.js +0 -597
  152. package/dist/commands/guardian.js.map +0 -1
  153. package/dist/commands/init.d.ts +0 -59
  154. package/dist/commands/init.d.ts.map +0 -1
  155. package/dist/commands/init.js +0 -650
  156. package/dist/commands/init.js.map +0 -1
  157. package/dist/commands/orchestrator.d.ts +0 -7
  158. package/dist/commands/orchestrator.d.ts.map +0 -1
  159. package/dist/commands/orchestrator.js +0 -571
  160. package/dist/commands/orchestrator.js.map +0 -1
  161. package/dist/commands/performance-optimizer.d.ts +0 -30
  162. package/dist/commands/performance-optimizer.d.ts.map +0 -1
  163. package/dist/commands/performance-optimizer.js +0 -650
  164. package/dist/commands/performance-optimizer.js.map +0 -1
  165. package/dist/commands/plugins.d.ts +0 -87
  166. package/dist/commands/plugins.d.ts.map +0 -1
  167. package/dist/commands/plugins.js +0 -685
  168. package/dist/commands/plugins.js.map +0 -1
  169. package/dist/commands/rag.d.ts +0 -7
  170. package/dist/commands/rag.d.ts.map +0 -1
  171. package/dist/commands/rag.js +0 -748
  172. package/dist/commands/rag.js.map +0 -1
  173. package/dist/commands/session.d.ts +0 -41
  174. package/dist/commands/session.d.ts.map +0 -1
  175. package/dist/commands/session.js +0 -441
  176. package/dist/commands/session.js.map +0 -1
  177. package/dist/commands/setup.d.ts +0 -29
  178. package/dist/commands/setup.d.ts.map +0 -1
  179. package/dist/commands/setup.js +0 -397
  180. package/dist/commands/setup.js.map +0 -1
  181. package/dist/commands/test-init.d.ts +0 -9
  182. package/dist/commands/test-init.d.ts.map +0 -1
  183. package/dist/commands/test-init.js +0 -222
  184. package/dist/commands/test-init.js.map +0 -1
  185. package/dist/commands/test.d.ts +0 -25
  186. package/dist/commands/test.d.ts.map +0 -1
  187. package/dist/commands/test.js +0 -217
  188. package/dist/commands/test.js.map +0 -1
  189. package/dist/commands/vp.d.ts +0 -7
  190. package/dist/commands/vp.d.ts.map +0 -1
  191. package/dist/commands/vp.js +0 -571
  192. package/dist/commands/vp.js.map +0 -1
  193. package/dist/commands/watch.d.ts +0 -76
  194. package/dist/commands/watch.d.ts.map +0 -1
  195. package/dist/commands/watch.js +0 -613
  196. package/dist/commands/watch.js.map +0 -1
  197. package/dist/commands/worktree.d.ts +0 -63
  198. package/dist/commands/worktree.d.ts.map +0 -1
  199. package/dist/commands/worktree.js +0 -774
  200. package/dist/commands/worktree.js.map +0 -1
  201. package/dist/context/context-manager.d.ts +0 -155
  202. package/dist/context/context-manager.d.ts.map +0 -1
  203. package/dist/context/context-manager.js +0 -383
  204. package/dist/context/context-manager.js.map +0 -1
  205. package/dist/context/index.d.ts +0 -3
  206. package/dist/context/index.d.ts.map +0 -1
  207. package/dist/context/index.js +0 -6
  208. package/dist/context/index.js.map +0 -1
  209. package/dist/context/session-manager.d.ts +0 -207
  210. package/dist/context/session-manager.d.ts.map +0 -1
  211. package/dist/context/session-manager.js +0 -686
  212. package/dist/context/session-manager.js.map +0 -1
  213. package/dist/index.d.ts +0 -8
  214. package/dist/index.d.ts.map +0 -1
  215. package/dist/index.js +0 -51
  216. package/dist/index.js.map +0 -1
  217. package/dist/interactive/interactive-mode.d.ts +0 -76
  218. package/dist/interactive/interactive-mode.d.ts.map +0 -1
  219. package/dist/interactive/interactive-mode.js +0 -732
  220. package/dist/interactive/interactive-mode.js.map +0 -1
  221. package/dist/nlp/command-mapper.d.ts +0 -174
  222. package/dist/nlp/command-mapper.d.ts.map +0 -1
  223. package/dist/nlp/command-mapper.js +0 -624
  224. package/dist/nlp/command-mapper.js.map +0 -1
  225. package/dist/nlp/command-parser.d.ts +0 -106
  226. package/dist/nlp/command-parser.d.ts.map +0 -1
  227. package/dist/nlp/command-parser.js +0 -417
  228. package/dist/nlp/command-parser.js.map +0 -1
  229. package/dist/nlp/index.d.ts +0 -5
  230. package/dist/nlp/index.d.ts.map +0 -1
  231. package/dist/nlp/index.js +0 -8
  232. package/dist/nlp/index.js.map +0 -1
  233. package/dist/nlp/intent-classifier.d.ts +0 -59
  234. package/dist/nlp/intent-classifier.d.ts.map +0 -1
  235. package/dist/nlp/intent-classifier.js +0 -384
  236. package/dist/nlp/intent-classifier.js.map +0 -1
  237. package/dist/nlp/intent-parser.d.ts +0 -152
  238. package/dist/nlp/intent-parser.d.ts.map +0 -1
  239. package/dist/nlp/intent-parser.js +0 -744
  240. package/dist/nlp/intent-parser.js.map +0 -1
  241. package/dist/plugins/plugin-manager.d.ts +0 -120
  242. package/dist/plugins/plugin-manager.d.ts.map +0 -1
  243. package/dist/plugins/plugin-manager.js +0 -595
  244. package/dist/plugins/plugin-manager.js.map +0 -1
  245. package/dist/types/index.d.ts +0 -224
  246. package/dist/types/index.d.ts.map +0 -1
  247. package/dist/types/index.js +0 -3
  248. package/dist/types/index.js.map +0 -1
  249. package/dist/utils/backup-rollback-manager.d.ts +0 -72
  250. package/dist/utils/backup-rollback-manager.d.ts.map +0 -1
  251. package/dist/utils/backup-rollback-manager.js +0 -289
  252. package/dist/utils/backup-rollback-manager.js.map +0 -1
  253. package/dist/utils/claude-config-installer.d.ts +0 -98
  254. package/dist/utils/claude-config-installer.d.ts.map +0 -1
  255. package/dist/utils/claude-config-installer.js +0 -678
  256. package/dist/utils/claude-config-installer.js.map +0 -1
  257. package/dist/utils/config-manager.d.ts +0 -73
  258. package/dist/utils/config-manager.d.ts.map +0 -1
  259. package/dist/utils/config-manager.js +0 -339
  260. package/dist/utils/config-manager.js.map +0 -1
  261. package/dist/utils/error-handler.d.ts +0 -46
  262. package/dist/utils/error-handler.d.ts.map +0 -1
  263. package/dist/utils/error-handler.js +0 -169
  264. package/dist/utils/error-handler.js.map +0 -1
  265. package/dist/utils/logger.d.ts +0 -25
  266. package/dist/utils/logger.d.ts.map +0 -1
  267. package/dist/utils/logger.js +0 -105
  268. package/dist/utils/logger.js.map +0 -1
  269. package/src/commands/computer-setup-commands.ts +0 -872
@@ -1,703 +0,0 @@
1
- "use strict";
2
- /**
3
- * Governance CLI Commands - IPRE Compliance
4
- *
5
- * Implements governance commands from Appendix B:
6
- * - wundr governance check - Run IPRE compliance check
7
- * - wundr governance report - Generate alignment debt report
8
- * - wundr governance status - Show current governance status
9
- * - wundr governance validate <file> - Validate IPRE config file
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.createAlignmentCommand = void 0;
13
- exports.createGovernanceCommand = createGovernanceCommand;
14
- exports.governanceCommand = createGovernanceCommand;
15
- const tslib_1 = require("tslib");
16
- const path_1 = tslib_1.__importDefault(require("path"));
17
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
18
- const commander_1 = require("commander");
19
- const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
20
- const yaml_1 = tslib_1.__importDefault(require("yaml"));
21
- const governance_1 = require("@wundr.io/governance");
22
- const error_handler_1 = require("../utils/error-handler");
23
- const logger_1 = require("../utils/logger");
24
- // ============================================================================
25
- // Governance Command Factory
26
- // ============================================================================
27
- /**
28
- * Creates the governance command with all subcommands
29
- */
30
- function createGovernanceCommand() {
31
- const governance = new commander_1.Command('governance')
32
- .alias('gov')
33
- .description('IPRE governance and compliance tools');
34
- // Check subcommand
35
- governance
36
- .command('check')
37
- .description('Run IPRE compliance check')
38
- .option('-s, --session <id>', 'Session ID to check')
39
- .option('-v, --verbose', 'Enable verbose output')
40
- .action(async (options) => {
41
- await runComplianceCheck(options);
42
- });
43
- // Report subcommand
44
- governance
45
- .command('report')
46
- .description('Generate alignment debt report')
47
- .option('-s, --session <id>', 'Session ID for the report')
48
- .option('-o, --output <file>', 'Output file path')
49
- .option('-f, --format <format>', 'Output format (md|json)', 'md')
50
- .action(async (options) => {
51
- await generateAlignmentReport(options);
52
- });
53
- // Status subcommand
54
- governance
55
- .command('status')
56
- .description('Show current governance status')
57
- .action(async () => {
58
- await showGovernanceStatus();
59
- });
60
- // Validate subcommand
61
- governance
62
- .command('validate <file>')
63
- .description('Validate IPRE config file')
64
- .action(async (file) => {
65
- await validateIPREConfig(file);
66
- });
67
- return governance;
68
- }
69
- // Re-export the full-featured alignment command from the dedicated module
70
- // This provides: report, score, history, and dimensions subcommands
71
- var alignment_1 = require("./alignment");
72
- Object.defineProperty(exports, "createAlignmentCommand", { enumerable: true, get: function () { return alignment_1.createAlignmentCommand; } });
73
- // ============================================================================
74
- // Command Implementations
75
- // ============================================================================
76
- /**
77
- * Run IPRE compliance check
78
- */
79
- async function runComplianceCheck(options) {
80
- try {
81
- logger_1.logger.info('Running IPRE compliance check...');
82
- const sessionId = options.session || `session-${Date.now()}`;
83
- const verbose = options.verbose || false;
84
- // Create evaluation context
85
- const context = {
86
- evaluationId: `eval-${Date.now()}`,
87
- timestamp: new Date(),
88
- source: 'manual',
89
- repository: process.cwd(),
90
- metadata: {
91
- sessionId,
92
- },
93
- };
94
- // Create evaluator suite
95
- const suite = (0, governance_1.createEvaluatorSuite)();
96
- // Run policy compliance check
97
- console.log(chalk_1.default.blue('\n--- Policy Compliance ---'));
98
- const complianceResult = await suite.policyCompliance.checkPolicyCompliance(context);
99
- displayComplianceResult(complianceResult, verbose);
100
- // Run reward alignment check
101
- console.log(chalk_1.default.blue('\n--- Reward Alignment ---'));
102
- const alignmentEvaluator = (0, governance_1.createEvaluator)('reward_alignment');
103
- const alignmentResult = await alignmentEvaluator.evaluate(context);
104
- displayAlignmentResult(alignmentResult, verbose);
105
- // Run drift detection
106
- console.log(chalk_1.default.blue('\n--- Drift Detection ---'));
107
- const driftEvaluator = (0, governance_1.createEvaluator)('drift_detection');
108
- const driftResult = await driftEvaluator.evaluate(context);
109
- displayDriftResult(driftResult, verbose);
110
- // Run full suite and show summary
111
- console.log(chalk_1.default.blue('\n--- Overall Summary ---'));
112
- const evaluators = [
113
- suite.policyCompliance,
114
- suite.rewardAlignment,
115
- suite.driftDetection,
116
- ];
117
- const suiteResult = await (0, governance_1.runEvaluatorSuite)(evaluators, context);
118
- displaySummary(suiteResult);
119
- // Save state for future checks
120
- await saveGovernanceState(sessionId, {
121
- complianceResult,
122
- alignmentResult,
123
- driftResult,
124
- suiteResult,
125
- });
126
- if (suiteResult.passed) {
127
- logger_1.logger.success('IPRE compliance check passed');
128
- }
129
- else {
130
- logger_1.logger.warn('IPRE compliance check found issues');
131
- process.exitCode = 1;
132
- }
133
- }
134
- catch (error) {
135
- throw error_handler_1.errorHandler.createError('WUNDR_GOV_CHECK_FAILED', 'Failed to run IPRE compliance check', { options }, true);
136
- }
137
- }
138
- /**
139
- * Generate alignment debt report
140
- */
141
- async function generateAlignmentReport(options) {
142
- try {
143
- logger_1.logger.info('Generating alignment debt report...');
144
- const sessionId = options.session || null;
145
- const format = options.format || 'md';
146
- const outputPath = options.output || `alignment-report-${Date.now()}.${format}`;
147
- // Create evaluation context
148
- const context = {
149
- evaluationId: `eval-${Date.now()}`,
150
- timestamp: new Date(),
151
- source: 'manual',
152
- repository: process.cwd(),
153
- };
154
- // Run all evaluations
155
- const suite = (0, governance_1.createEvaluatorSuite)();
156
- const complianceResult = await suite.policyCompliance.checkPolicyCompliance(context);
157
- // Get alignment gaps
158
- const alignmentEvaluator = (0, governance_1.createEvaluator)('reward_alignment');
159
- const alignmentEvalResult = await alignmentEvaluator.evaluate(context);
160
- // Get drift indicators
161
- const driftEvaluator = (0, governance_1.createEvaluator)('drift_detection');
162
- const driftEvalResult = await driftEvaluator.evaluate(context);
163
- // Build report
164
- const report = {
165
- generatedAt: new Date().toISOString(),
166
- sessionId,
167
- summary: {
168
- totalDebt: calculateAlignmentDebt(complianceResult, alignmentEvalResult, driftEvalResult),
169
- criticalIssues: countCriticalIssues(complianceResult),
170
- highPriorityItems: countHighPriorityItems(alignmentEvalResult),
171
- alignmentScore: alignmentEvalResult.score,
172
- complianceScore: complianceResult.score,
173
- driftScore: 1 - driftEvalResult.score, // Invert since lower drift is better
174
- },
175
- policyViolations: complianceResult.violations.map(v => ({
176
- policyId: v.policyId,
177
- policyName: v.policyName,
178
- severity: v.severity,
179
- description: v.description,
180
- location: v.location,
181
- suggestedFix: v.suggestedFix,
182
- })),
183
- alignmentGaps: extractAlignmentGaps(alignmentEvalResult),
184
- driftAlerts: extractDriftAlerts(driftEvalResult),
185
- recommendations: generateRecommendations(complianceResult, alignmentEvalResult, driftEvalResult),
186
- };
187
- // Output report
188
- if (format === 'json') {
189
- await fs_extra_1.default.writeJson(outputPath, report, { spaces: 2 });
190
- }
191
- else {
192
- const markdown = formatReportAsMarkdown(report);
193
- await fs_extra_1.default.writeFile(outputPath, markdown, 'utf-8');
194
- }
195
- logger_1.logger.success(`Alignment debt report generated: ${outputPath}`);
196
- // Display summary
197
- console.log(chalk_1.default.blue('\n--- Report Summary ---'));
198
- console.log(`Total Alignment Debt: ${chalk_1.default.yellow(report.summary.totalDebt.toFixed(2))}`);
199
- console.log(`Critical Issues: ${chalk_1.default.red(report.summary.criticalIssues)}`);
200
- console.log(`High Priority Items: ${chalk_1.default.yellow(report.summary.highPriorityItems)}`);
201
- console.log(`Alignment Score: ${colorScore(report.summary.alignmentScore)}`);
202
- console.log(`Compliance Score: ${colorScore(report.summary.complianceScore)}`);
203
- console.log(`Drift Score: ${colorScore(1 - report.summary.driftScore)}`);
204
- }
205
- catch (error) {
206
- throw error_handler_1.errorHandler.createError('WUNDR_GOV_REPORT_FAILED', 'Failed to generate alignment debt report', { options }, true);
207
- }
208
- }
209
- /**
210
- * Show current governance status
211
- */
212
- async function showGovernanceStatus() {
213
- try {
214
- logger_1.logger.info('Fetching governance status...');
215
- // Load saved state if available
216
- const state = await loadGovernanceState();
217
- // Create policy engine and get stats
218
- const policyEngine = new governance_1.PolicyEngine();
219
- const violationStats = policyEngine.getViolationStats();
220
- const status = {
221
- alignmentScore: state?.suiteResult?.overallScore ?? 0,
222
- policyViolations: violationStats.total,
223
- recentInterventions: await loadRecentInterventions(),
224
- lastCheck: state?.timestamp ? new Date(state.timestamp) : null,
225
- driftIndicators: extractDriftIndicatorsFromState(state),
226
- };
227
- // Display status
228
- console.log(chalk_1.default.cyan('\n===================================='));
229
- console.log(chalk_1.default.cyan(' GOVERNANCE STATUS'));
230
- console.log(chalk_1.default.cyan('====================================\n'));
231
- // Alignment Score
232
- console.log(chalk_1.default.bold('Alignment Score:'));
233
- displayProgressBar(status.alignmentScore);
234
- console.log(` ${colorScore(status.alignmentScore)} (${(status.alignmentScore * 100).toFixed(1)}%)\n`);
235
- // Policy Violations
236
- console.log(chalk_1.default.bold('Policy Violations:'));
237
- if (status.policyViolations === 0) {
238
- console.log(chalk_1.default.green(' No active violations'));
239
- }
240
- else {
241
- console.log(chalk_1.default.red(` ${status.policyViolations} active violations`));
242
- console.log(` - Security: ${violationStats.byCategory.security}`);
243
- console.log(` - Compliance: ${violationStats.byCategory.compliance}`);
244
- console.log(` - Operational: ${violationStats.byCategory.operational}`);
245
- }
246
- console.log();
247
- // Recent Interventions
248
- console.log(chalk_1.default.bold('Recent Interventions:'));
249
- if (status.recentInterventions.length === 0) {
250
- console.log(chalk_1.default.green(' No recent interventions'));
251
- }
252
- else {
253
- for (const intervention of status.recentInterventions.slice(0, 5)) {
254
- const statusIcon = intervention.resolved
255
- ? chalk_1.default.green('[RESOLVED]')
256
- : chalk_1.default.yellow('[OPEN]');
257
- console.log(` ${statusIcon} ${intervention.type}: ${intervention.description}`);
258
- }
259
- }
260
- console.log();
261
- // Drift Indicators
262
- console.log(chalk_1.default.bold('Drift Indicators:'));
263
- if (status.driftIndicators.length === 0) {
264
- console.log(chalk_1.default.green(' No significant drift detected'));
265
- }
266
- else {
267
- for (const indicator of status.driftIndicators) {
268
- const severityColor = getSeverityColor(indicator.severity);
269
- const direction = indicator.change > 0 ? '+' : '';
270
- console.log(` ${severityColor(`[${indicator.severity.toUpperCase()}]`)} ` +
271
- `${indicator.pattern}: ${direction}${(indicator.change * 100).toFixed(1)}%`);
272
- }
273
- }
274
- console.log();
275
- // Last Check
276
- if (status.lastCheck) {
277
- console.log(chalk_1.default.gray(`Last check: ${status.lastCheck.toLocaleString()}`));
278
- }
279
- else {
280
- console.log(chalk_1.default.gray('No previous checks found. Run "wundr governance check" to start.'));
281
- }
282
- }
283
- catch (error) {
284
- throw error_handler_1.errorHandler.createError('WUNDR_GOV_STATUS_FAILED', 'Failed to fetch governance status', {}, true);
285
- }
286
- }
287
- /**
288
- * Validate IPRE config file
289
- */
290
- async function validateIPREConfig(file) {
291
- try {
292
- const filePath = path_1.default.isAbsolute(file)
293
- ? file
294
- : path_1.default.join(process.cwd(), file);
295
- logger_1.logger.info(`Validating IPRE config: ${filePath}`);
296
- // Check file exists
297
- if (!(await fs_extra_1.default.pathExists(filePath))) {
298
- logger_1.logger.error(`File not found: ${filePath}`);
299
- process.exitCode = 1;
300
- return;
301
- }
302
- // Read and parse file
303
- const content = await fs_extra_1.default.readFile(filePath, 'utf-8');
304
- let config;
305
- const ext = path_1.default.extname(file).toLowerCase();
306
- if (ext === '.yaml' || ext === '.yml') {
307
- config = yaml_1.default.parse(content);
308
- }
309
- else if (ext === '.json') {
310
- config = JSON.parse(content);
311
- }
312
- else {
313
- logger_1.logger.error('Unsupported file format. Use .yaml, .yml, or .json');
314
- process.exitCode = 1;
315
- return;
316
- }
317
- // Validate schema
318
- const validationErrors = validateIPRESchema(config);
319
- if (validationErrors.length === 0) {
320
- console.log(chalk_1.default.green('\nIPRE configuration is valid'));
321
- displayConfigSummary(config);
322
- }
323
- else {
324
- console.log(chalk_1.default.red('\nIPRE configuration validation failed:\n'));
325
- for (const error of validationErrors) {
326
- console.log(chalk_1.default.red(` - ${error}`));
327
- }
328
- process.exitCode = 1;
329
- }
330
- }
331
- catch (error) {
332
- const message = error instanceof Error ? error.message : String(error);
333
- throw error_handler_1.errorHandler.createError('WUNDR_GOV_VALIDATE_FAILED', `Failed to validate IPRE config: ${message}`, { file }, true);
334
- }
335
- }
336
- // ============================================================================
337
- // Helper Functions
338
- // ============================================================================
339
- function displayComplianceResult(result, verbose) {
340
- const statusIcon = result.compliant
341
- ? chalk_1.default.green('[PASS]')
342
- : chalk_1.default.red('[FAIL]');
343
- console.log(`${statusIcon} Compliance Score: ${colorScore(result.score)}`);
344
- console.log(` Passed Policies: ${result.passedPolicies.length}`);
345
- console.log(` Skipped Policies: ${result.skippedPolicies.length}`);
346
- console.log(` Violations: ${result.violations.length}`);
347
- if (verbose && result.violations.length > 0) {
348
- console.log(chalk_1.default.yellow('\n Violations:'));
349
- for (const violation of result.violations) {
350
- console.log(` - [${violation.severity.toUpperCase()}] ${violation.policyName}`);
351
- console.log(` ${violation.description}`);
352
- if (violation.suggestedFix) {
353
- console.log(chalk_1.default.gray(` Fix: ${violation.suggestedFix}`));
354
- }
355
- }
356
- }
357
- }
358
- function displayAlignmentResult(result, verbose) {
359
- const statusIcon = result.passed
360
- ? chalk_1.default.green('[PASS]')
361
- : chalk_1.default.red('[FAIL]');
362
- console.log(`${statusIcon} Alignment Score: ${colorScore(result.score)}`);
363
- console.log(` Issues: ${result.issues.length}`);
364
- console.log(` Recommendations: ${result.recommendations.length}`);
365
- if (verbose && result.issues.length > 0) {
366
- console.log(chalk_1.default.yellow('\n Issues:'));
367
- for (const issue of result.issues) {
368
- console.log(` - ${issue}`);
369
- }
370
- }
371
- if (verbose && result.recommendations.length > 0) {
372
- console.log(chalk_1.default.blue('\n Recommendations:'));
373
- for (const rec of result.recommendations) {
374
- console.log(` - ${rec}`);
375
- }
376
- }
377
- }
378
- function displayDriftResult(result, verbose) {
379
- // Note: For drift, higher score means less drift (inverted in evaluation)
380
- const driftScore = 1 - result.score;
381
- const statusIcon = result.passed
382
- ? chalk_1.default.green('[PASS]')
383
- : chalk_1.default.red('[FAIL]');
384
- console.log(`${statusIcon} Drift Score: ${colorScore(result.score)} (${(driftScore * 100).toFixed(1)}% drift)`);
385
- console.log(` Drift Alerts: ${result.issues.length}`);
386
- if (verbose && result.issues.length > 0) {
387
- console.log(chalk_1.default.yellow('\n Drift Alerts:'));
388
- for (const issue of result.issues) {
389
- console.log(` - ${issue}`);
390
- }
391
- }
392
- }
393
- function displaySummary(result) {
394
- const statusIcon = result.passed
395
- ? chalk_1.default.green('[PASSED]')
396
- : chalk_1.default.red('[FAILED]');
397
- console.log(`\n${statusIcon} Overall Score: ${colorScore(result.overallScore)}`);
398
- if (result.criticalIssues.length > 0) {
399
- console.log(chalk_1.default.red(`\nCritical Issues (${result.criticalIssues.length}):`));
400
- for (const issue of result.criticalIssues.slice(0, 5)) {
401
- console.log(chalk_1.default.red(` - ${issue}`));
402
- }
403
- if (result.criticalIssues.length > 5) {
404
- console.log(chalk_1.default.gray(` ... and ${result.criticalIssues.length - 5} more`));
405
- }
406
- }
407
- }
408
- function colorScore(score) {
409
- const percentage = (score * 100).toFixed(1);
410
- if (score >= 0.9) {
411
- return chalk_1.default.green(`${percentage}%`);
412
- }
413
- if (score >= 0.7) {
414
- return chalk_1.default.yellow(`${percentage}%`);
415
- }
416
- return chalk_1.default.red(`${percentage}%`);
417
- }
418
- function getSeverityColor(severity) {
419
- switch (severity) {
420
- case 'critical':
421
- return chalk_1.default.red;
422
- case 'high':
423
- return chalk_1.default.yellow;
424
- case 'medium':
425
- return chalk_1.default.blue;
426
- default:
427
- return chalk_1.default.gray;
428
- }
429
- }
430
- function displayProgressBar(score) {
431
- const width = 30;
432
- const filled = Math.round(score * width);
433
- const empty = width - filled;
434
- const bar = chalk_1.default.green('[' + '='.repeat(filled)) + chalk_1.default.gray('-'.repeat(empty) + ']');
435
- console.log(` ${bar}`);
436
- }
437
- function calculateAlignmentDebt(compliance, alignment, drift) {
438
- // Calculate debt as weighted sum of issues
439
- const complianceDebt = (1 - compliance.score) * 0.4;
440
- const alignmentDebt = (1 - alignment.score) * 0.35;
441
- const driftDebt = (1 - drift.score) * 0.25;
442
- return complianceDebt + alignmentDebt + driftDebt;
443
- }
444
- function countCriticalIssues(compliance) {
445
- return compliance.violations.filter(v => v.severity === 'critical').length;
446
- }
447
- function countHighPriorityItems(alignment) {
448
- // Count issues that contain high-priority indicators
449
- return alignment.issues.filter(issue => issue.toLowerCase().includes('critical') ||
450
- issue.toLowerCase().includes('high')).length;
451
- }
452
- function extractAlignmentGaps(result) {
453
- // Parse alignment gaps from issues
454
- const gaps = [];
455
- for (const issue of result.issues) {
456
- const match = issue.match(/gap in (\w+): expected ([\d.]+), got ([\d.]+)/i);
457
- if (match) {
458
- const expected = parseFloat(match[2] ?? '0');
459
- const actual = parseFloat(match[3] ?? '0');
460
- gaps.push({
461
- dimension: match[1] ?? 'unknown',
462
- expected,
463
- actual,
464
- gap: expected - actual,
465
- priority: expected - actual > 0.2
466
- ? 'high'
467
- : expected - actual > 0.1
468
- ? 'medium'
469
- : 'low',
470
- });
471
- }
472
- }
473
- return gaps;
474
- }
475
- function extractDriftAlerts(result) {
476
- // Parse drift alerts from issues
477
- const alerts = [];
478
- for (const issue of result.issues) {
479
- const match = issue.match(/Drift.*in (\w+): ([\d.]+)% (\w+)/i);
480
- if (match) {
481
- const changePercent = parseFloat(match[2] ?? '0');
482
- alerts.push({
483
- pattern: match[1] ?? 'unknown',
484
- baselineValue: 0.9, // Default baseline
485
- currentValue: 0.9 * (1 + changePercent / 100),
486
- changePercent,
487
- direction: match[3] ?? 'stable',
488
- severity: changePercent >= 30
489
- ? 'critical'
490
- : changePercent >= 20
491
- ? 'high'
492
- : 'medium',
493
- });
494
- }
495
- }
496
- return alerts;
497
- }
498
- function generateRecommendations(compliance, alignment, drift) {
499
- const recommendations = [];
500
- // Add compliance recommendations
501
- if (compliance.violations.length > 0) {
502
- recommendations.push('Address policy violations immediately, especially critical ones');
503
- const criticalCount = compliance.violations.filter(v => v.severity === 'critical').length;
504
- if (criticalCount > 0) {
505
- recommendations.push(`Fix ${criticalCount} critical policy violation(s) before deployment`);
506
- }
507
- }
508
- // Add alignment recommendations from evaluator
509
- recommendations.push(...alignment.recommendations);
510
- // Add drift recommendations
511
- if (drift.issues.length > 0) {
512
- recommendations.push('Investigate drift causes and consider recalibration');
513
- }
514
- // General recommendations
515
- if (compliance.score < 0.8) {
516
- recommendations.push('Review and update security policies');
517
- }
518
- if (alignment.score < 0.85) {
519
- recommendations.push('Schedule alignment review session');
520
- }
521
- return [...new Set(recommendations)]; // Remove duplicates
522
- }
523
- function formatReportAsMarkdown(report) {
524
- let md = '# Alignment Debt Report\n\n';
525
- md += `Generated: ${report.generatedAt}\n`;
526
- if (report.sessionId) {
527
- md += `Session: ${report.sessionId}\n`;
528
- }
529
- md += '\n---\n\n';
530
- // Summary
531
- md += '## Summary\n\n';
532
- md += '| Metric | Value |\n';
533
- md += '|--------|-------|\n';
534
- md += `| Total Alignment Debt | ${report.summary.totalDebt.toFixed(2)} |\n`;
535
- md += `| Critical Issues | ${report.summary.criticalIssues} |\n`;
536
- md += `| High Priority Items | ${report.summary.highPriorityItems} |\n`;
537
- md += `| Alignment Score | ${(report.summary.alignmentScore * 100).toFixed(1)}% |\n`;
538
- md += `| Compliance Score | ${(report.summary.complianceScore * 100).toFixed(1)}% |\n`;
539
- md += `| Drift Score | ${(report.summary.driftScore * 100).toFixed(1)}% |\n`;
540
- md += '\n';
541
- // Policy Violations
542
- if (report.policyViolations.length > 0) {
543
- md += '## Policy Violations\n\n';
544
- for (const v of report.policyViolations) {
545
- md += `### ${v.policyName} (${v.severity.toUpperCase()})\n\n`;
546
- md += `- **Policy ID:** ${v.policyId}\n`;
547
- md += `- **Description:** ${v.description}\n`;
548
- if (v.location) {
549
- md += `- **Location:** ${v.location}\n`;
550
- }
551
- if (v.suggestedFix) {
552
- md += `- **Suggested Fix:** ${v.suggestedFix}\n`;
553
- }
554
- md += '\n';
555
- }
556
- }
557
- // Alignment Gaps
558
- if (report.alignmentGaps.length > 0) {
559
- md += '## Alignment Gaps\n\n';
560
- md += '| Dimension | Expected | Actual | Gap | Priority |\n';
561
- md += '|-----------|----------|--------|-----|----------|\n';
562
- for (const g of report.alignmentGaps) {
563
- md += `| ${g.dimension} | ${(g.expected * 100).toFixed(1)}% | ${(g.actual * 100).toFixed(1)}% | ${(g.gap * 100).toFixed(1)}% | ${g.priority} |\n`;
564
- }
565
- md += '\n';
566
- }
567
- // Drift Alerts
568
- if (report.driftAlerts.length > 0) {
569
- md += '## Drift Alerts\n\n';
570
- md += '| Pattern | Change | Direction | Severity |\n';
571
- md += '|---------|--------|-----------|----------|\n';
572
- for (const d of report.driftAlerts) {
573
- md += `| ${d.pattern} | ${d.changePercent.toFixed(1)}% | ${d.direction} | ${d.severity} |\n`;
574
- }
575
- md += '\n';
576
- }
577
- // Recommendations
578
- if (report.recommendations.length > 0) {
579
- md += '## Recommendations\n\n';
580
- for (const rec of report.recommendations) {
581
- md += `- ${rec}\n`;
582
- }
583
- md += '\n';
584
- }
585
- return md;
586
- }
587
- function validateIPRESchema(config) {
588
- const errors = [];
589
- // Required fields
590
- if (!config.version) {
591
- errors.push('Missing required field: version');
592
- }
593
- if (!config.intent) {
594
- errors.push('Missing required field: intent');
595
- }
596
- else {
597
- if (!config.intent.mission) {
598
- errors.push('Missing required field: intent.mission');
599
- }
600
- if (!config.intent.values || !Array.isArray(config.intent.values)) {
601
- errors.push('Missing or invalid field: intent.values (must be array)');
602
- }
603
- }
604
- if (!config.policies) {
605
- errors.push('Missing required field: policies');
606
- }
607
- else {
608
- if (!Array.isArray(config.policies.security)) {
609
- errors.push('policies.security must be an array');
610
- }
611
- if (!Array.isArray(config.policies.compliance)) {
612
- errors.push('policies.compliance must be an array');
613
- }
614
- if (!Array.isArray(config.policies.operational)) {
615
- errors.push('policies.operational must be an array');
616
- }
617
- }
618
- if (!config.rewards) {
619
- errors.push('Missing required field: rewards');
620
- }
621
- else {
622
- if (!config.rewards.weights) {
623
- errors.push('Missing required field: rewards.weights');
624
- }
625
- if (typeof config.rewards.threshold !== 'number') {
626
- errors.push('rewards.threshold must be a number');
627
- }
628
- }
629
- if (!config.evaluators) {
630
- errors.push('Missing required field: evaluators');
631
- }
632
- else if (!Array.isArray(config.evaluators)) {
633
- errors.push('evaluators must be an array');
634
- }
635
- return errors;
636
- }
637
- function displayConfigSummary(config) {
638
- console.log(chalk_1.default.blue('\n--- Configuration Summary ---'));
639
- console.log(`Version: ${config.version}`);
640
- console.log(`Mission: ${config.intent?.mission || 'Not defined'}`);
641
- console.log(`Values: ${config.intent?.values?.length || 0} defined`);
642
- console.log(`Security Policies: ${config.policies?.security?.length || 0}`);
643
- console.log(`Compliance Policies: ${config.policies?.compliance?.length || 0}`);
644
- console.log(`Operational Policies: ${config.policies?.operational?.length || 0}`);
645
- console.log(`Evaluators: ${config.evaluators?.length || 0}`);
646
- if (config.rewards?.threshold) {
647
- console.log(`Reward Threshold: ${config.rewards.threshold}`);
648
- }
649
- }
650
- // ============================================================================
651
- // State Management
652
- // ============================================================================
653
- const GOVERNANCE_STATE_PATH = '.wundr/governance-state.json';
654
- async function saveGovernanceState(sessionId, data) {
655
- const statePath = path_1.default.join(process.cwd(), GOVERNANCE_STATE_PATH);
656
- await fs_extra_1.default.ensureDir(path_1.default.dirname(statePath));
657
- const state = {
658
- timestamp: new Date().toISOString(),
659
- sessionId,
660
- suiteResult: {
661
- passed: data.suiteResult.passed,
662
- overallScore: data.suiteResult.overallScore,
663
- criticalIssues: [...data.suiteResult.criticalIssues],
664
- },
665
- complianceResult: data.complianceResult,
666
- alignmentResult: data.alignmentResult,
667
- driftResult: data.driftResult,
668
- };
669
- await fs_extra_1.default.writeJson(statePath, state, { spaces: 2 });
670
- }
671
- async function loadGovernanceState() {
672
- const statePath = path_1.default.join(process.cwd(), GOVERNANCE_STATE_PATH);
673
- if (await fs_extra_1.default.pathExists(statePath)) {
674
- return await fs_extra_1.default.readJson(statePath);
675
- }
676
- return null;
677
- }
678
- async function loadRecentInterventions() {
679
- // Load from state file or return empty array
680
- // In a real implementation, this would load from a persistent store
681
- return [];
682
- }
683
- function extractDriftIndicatorsFromState(state) {
684
- if (!state?.driftResult) {
685
- return [];
686
- }
687
- const driftResult = state.driftResult;
688
- const indicators = [];
689
- for (const issue of driftResult.issues || []) {
690
- const match = issue.match(/Drift.*in (\w+): ([\d.]+)%/i);
691
- if (match) {
692
- indicators.push({
693
- pattern: match[1] ?? 'unknown',
694
- baseline: 0.9,
695
- current: 0.9 * (1 + parseFloat(match[2] ?? '0') / 100),
696
- change: parseFloat(match[2] ?? '0') / 100,
697
- severity: 'medium',
698
- });
699
- }
700
- }
701
- return indicators;
702
- }
703
- //# sourceMappingURL=governance.js.map