stylemcp 0.1.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 (83) hide show
  1. package/README.md +261 -0
  2. package/action/action.yml +59 -0
  3. package/action/package.json +24 -0
  4. package/action/src/index.ts +455 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +335 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +10 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/rewriter/index.d.ts +45 -0
  14. package/dist/rewriter/index.d.ts.map +1 -0
  15. package/dist/rewriter/index.js +163 -0
  16. package/dist/rewriter/index.js.map +1 -0
  17. package/dist/schema/copy-patterns.d.ts +298 -0
  18. package/dist/schema/copy-patterns.d.ts.map +1 -0
  19. package/dist/schema/copy-patterns.js +53 -0
  20. package/dist/schema/copy-patterns.js.map +1 -0
  21. package/dist/schema/cta-rules.d.ts +274 -0
  22. package/dist/schema/cta-rules.d.ts.map +1 -0
  23. package/dist/schema/cta-rules.js +45 -0
  24. package/dist/schema/cta-rules.js.map +1 -0
  25. package/dist/schema/index.d.ts +2172 -0
  26. package/dist/schema/index.d.ts.map +1 -0
  27. package/dist/schema/index.js +92 -0
  28. package/dist/schema/index.js.map +1 -0
  29. package/dist/schema/tests.d.ts +274 -0
  30. package/dist/schema/tests.d.ts.map +1 -0
  31. package/dist/schema/tests.js +37 -0
  32. package/dist/schema/tests.js.map +1 -0
  33. package/dist/schema/tokens.d.ts +632 -0
  34. package/dist/schema/tokens.d.ts.map +1 -0
  35. package/dist/schema/tokens.js +68 -0
  36. package/dist/schema/tokens.js.map +1 -0
  37. package/dist/schema/voice.d.ts +280 -0
  38. package/dist/schema/voice.d.ts.map +1 -0
  39. package/dist/schema/voice.js +52 -0
  40. package/dist/schema/voice.js.map +1 -0
  41. package/dist/server/billing.d.ts +53 -0
  42. package/dist/server/billing.d.ts.map +1 -0
  43. package/dist/server/billing.js +216 -0
  44. package/dist/server/billing.js.map +1 -0
  45. package/dist/server/http.d.ts +5 -0
  46. package/dist/server/http.d.ts.map +1 -0
  47. package/dist/server/http.js +470 -0
  48. package/dist/server/http.js.map +1 -0
  49. package/dist/server/index.d.ts +3 -0
  50. package/dist/server/index.d.ts.map +1 -0
  51. package/dist/server/index.js +480 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/middleware/auth.d.ts +15 -0
  54. package/dist/server/middleware/auth.d.ts.map +1 -0
  55. package/dist/server/middleware/auth.js +83 -0
  56. package/dist/server/middleware/auth.js.map +1 -0
  57. package/dist/utils/pack-loader.d.ts +13 -0
  58. package/dist/utils/pack-loader.d.ts.map +1 -0
  59. package/dist/utils/pack-loader.js +98 -0
  60. package/dist/utils/pack-loader.js.map +1 -0
  61. package/dist/validator/index.d.ts +21 -0
  62. package/dist/validator/index.d.ts.map +1 -0
  63. package/dist/validator/index.js +60 -0
  64. package/dist/validator/index.js.map +1 -0
  65. package/dist/validator/rules/constraints.d.ts +8 -0
  66. package/dist/validator/rules/constraints.d.ts.map +1 -0
  67. package/dist/validator/rules/constraints.js +150 -0
  68. package/dist/validator/rules/constraints.js.map +1 -0
  69. package/dist/validator/rules/cta.d.ts +11 -0
  70. package/dist/validator/rules/cta.d.ts.map +1 -0
  71. package/dist/validator/rules/cta.js +113 -0
  72. package/dist/validator/rules/cta.js.map +1 -0
  73. package/dist/validator/rules/voice.d.ts +6 -0
  74. package/dist/validator/rules/voice.d.ts.map +1 -0
  75. package/dist/validator/rules/voice.js +106 -0
  76. package/dist/validator/rules/voice.js.map +1 -0
  77. package/package.json +61 -0
  78. package/packs/saas/copy_patterns.yaml +423 -0
  79. package/packs/saas/cta_rules.yaml +362 -0
  80. package/packs/saas/manifest.yaml +16 -0
  81. package/packs/saas/tests.yaml +305 -0
  82. package/packs/saas/tokens.json +226 -0
  83. package/packs/saas/voice.yaml +232 -0
@@ -0,0 +1,335 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { readFile } from 'fs/promises';
5
+ import { join } from 'path';
6
+ import { loadPack, getPacksDirectory, listAvailablePacks } from '../utils/pack-loader.js';
7
+ import { validate } from '../validator/index.js';
8
+ import { rewrite, formatChanges, generateDiff } from '../rewriter/index.js';
9
+ const program = new Command();
10
+ program
11
+ .name('stylemcp')
12
+ .description('Executable brand rules for models and agents')
13
+ .version('0.1.0');
14
+ /**
15
+ * Validate command
16
+ */
17
+ program
18
+ .command('validate')
19
+ .description('Validate text against style rules')
20
+ .argument('[text]', 'Text to validate (or use --file)')
21
+ .option('-f, --file <path>', 'Read text from file')
22
+ .option('-p, --pack <name>', 'Style pack to use', 'saas')
23
+ .option('-t, --type <type>', 'Content type (ui-copy, marketing, docs, support, general)')
24
+ .option('--json', 'Output as JSON')
25
+ .option('--strict', 'Fail on any violation')
26
+ .action(async (text, options) => {
27
+ try {
28
+ // Get text from argument or file
29
+ let inputText = text;
30
+ if (options.file) {
31
+ inputText = await readFile(options.file, 'utf-8');
32
+ }
33
+ if (!inputText) {
34
+ console.error(chalk.red('Error: No text provided. Use argument or --file'));
35
+ process.exit(1);
36
+ }
37
+ // Load pack
38
+ const packPath = join(getPacksDirectory(), options.pack);
39
+ const { pack, errors } = await loadPack({ packPath });
40
+ if (errors.length > 0) {
41
+ console.error(chalk.yellow('Pack warnings:'), errors.join(', '));
42
+ }
43
+ // Validate
44
+ const result = validate({
45
+ pack,
46
+ text: inputText,
47
+ context: options.type ? { type: options.type } : undefined,
48
+ });
49
+ // Output
50
+ if (options.json) {
51
+ console.log(JSON.stringify(result, null, 2));
52
+ }
53
+ else {
54
+ printValidationResult(result);
55
+ }
56
+ // Exit code
57
+ const shouldFail = options.strict ? !result.valid || result.violations.length > 0 : !result.valid;
58
+ process.exit(shouldFail ? 1 : 0);
59
+ }
60
+ catch (error) {
61
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
62
+ process.exit(1);
63
+ }
64
+ });
65
+ /**
66
+ * Rewrite command
67
+ */
68
+ program
69
+ .command('rewrite')
70
+ .description('Rewrite text to conform to style rules')
71
+ .argument('[text]', 'Text to rewrite (or use --file)')
72
+ .option('-f, --file <path>', 'Read text from file')
73
+ .option('-p, --pack <name>', 'Style pack to use', 'saas')
74
+ .option('-m, --mode <mode>', 'Rewrite mode (minimal, normal, aggressive)', 'normal')
75
+ .option('-t, --type <type>', 'Content type (ui-copy, marketing, docs, support, general)')
76
+ .option('--json', 'Output as JSON')
77
+ .option('--diff', 'Show diff format')
78
+ .option('--changes-only', 'Only show changes, not full text')
79
+ .action(async (text, options) => {
80
+ try {
81
+ let inputText = text;
82
+ if (options.file) {
83
+ inputText = await readFile(options.file, 'utf-8');
84
+ }
85
+ if (!inputText) {
86
+ console.error(chalk.red('Error: No text provided. Use argument or --file'));
87
+ process.exit(1);
88
+ }
89
+ const packPath = join(getPacksDirectory(), options.pack);
90
+ const { pack, errors } = await loadPack({ packPath });
91
+ if (errors.length > 0) {
92
+ console.error(chalk.yellow('Pack warnings:'), errors.join(', '));
93
+ }
94
+ const result = rewrite({
95
+ pack,
96
+ text: inputText,
97
+ context: options.type ? { type: options.type } : undefined,
98
+ fixSeverity: options.mode === 'minimal'
99
+ ? ['error']
100
+ : options.mode === 'aggressive'
101
+ ? ['error', 'warning', 'info']
102
+ : ['error', 'warning'],
103
+ });
104
+ if (options.json) {
105
+ console.log(JSON.stringify(result, null, 2));
106
+ }
107
+ else if (options.diff) {
108
+ console.log(generateDiff(result));
109
+ }
110
+ else if (options.changesOnly) {
111
+ console.log(formatChanges(result));
112
+ }
113
+ else {
114
+ console.log(chalk.bold('Rewritten text:'));
115
+ console.log(result.rewritten);
116
+ console.log();
117
+ console.log(chalk.dim(`Score: ${result.score.before} → ${result.score.after}`));
118
+ console.log(chalk.dim(`Changes: ${result.changes.length}`));
119
+ }
120
+ }
121
+ catch (error) {
122
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
123
+ process.exit(1);
124
+ }
125
+ });
126
+ /**
127
+ * Test command - run tests from a pack
128
+ */
129
+ program
130
+ .command('test')
131
+ .description('Run tests from a style pack')
132
+ .option('-p, --pack <name>', 'Style pack to use', 'saas')
133
+ .option('--filter <pattern>', 'Filter tests by ID or tag')
134
+ .option('--json', 'Output as JSON')
135
+ .action(async (options) => {
136
+ try {
137
+ const packPath = join(getPacksDirectory(), options.pack);
138
+ const { pack, errors } = await loadPack({ packPath });
139
+ if (errors.length > 0) {
140
+ console.error(chalk.yellow('Pack warnings:'), errors.join(', '));
141
+ }
142
+ let tests = pack.tests.tests;
143
+ if (options.filter) {
144
+ const filter = options.filter.toLowerCase();
145
+ tests = tests.filter(t => t.id.toLowerCase().includes(filter) ||
146
+ t.tags.some(tag => tag.toLowerCase().includes(filter)));
147
+ }
148
+ const results = [];
149
+ let passed = 0;
150
+ let failed = 0;
151
+ for (const test of tests) {
152
+ const result = validate({
153
+ pack,
154
+ text: test.input,
155
+ context: test.context,
156
+ });
157
+ // Check expectations
158
+ let testPassed = true;
159
+ if (test.expect.pass !== undefined) {
160
+ testPassed = testPassed && result.valid === test.expect.pass;
161
+ }
162
+ if (test.expect.minScore !== undefined) {
163
+ testPassed = testPassed && result.score >= test.expect.minScore;
164
+ }
165
+ if (test.expect.maxScore !== undefined) {
166
+ testPassed = testPassed && result.score <= test.expect.maxScore;
167
+ }
168
+ if (test.expect.violations) {
169
+ for (const expectedViolation of test.expect.violations) {
170
+ const found = result.violations.some(v => v.rule.includes(expectedViolation.rule) &&
171
+ (!expectedViolation.severity || v.severity === expectedViolation.severity));
172
+ testPassed = testPassed && found;
173
+ }
174
+ }
175
+ if (test.expect.noViolations) {
176
+ for (const noViolation of test.expect.noViolations) {
177
+ const found = result.violations.some(v => v.rule.includes(noViolation));
178
+ testPassed = testPassed && !found;
179
+ }
180
+ }
181
+ if (testPassed) {
182
+ passed++;
183
+ }
184
+ else {
185
+ failed++;
186
+ }
187
+ results.push({ test, passed: testPassed, result });
188
+ }
189
+ if (options.json) {
190
+ console.log(JSON.stringify({ passed, failed, total: tests.length, results }, null, 2));
191
+ }
192
+ else {
193
+ console.log(chalk.bold(`\nRunning ${tests.length} tests from pack "${options.pack}"...\n`));
194
+ for (const { test, passed: testPassed, result } of results) {
195
+ const icon = testPassed ? chalk.green('✓') : chalk.red('✗');
196
+ const status = testPassed ? chalk.green('PASS') : chalk.red('FAIL');
197
+ console.log(`${icon} ${test.id}: ${test.name} [${status}]`);
198
+ if (!testPassed) {
199
+ console.log(chalk.dim(` Input: "${test.input.slice(0, 60)}${test.input.length > 60 ? '...' : ''}"`));
200
+ console.log(chalk.dim(` Score: ${result.score}, Valid: ${result.valid}`));
201
+ if (result.violations.length > 0) {
202
+ console.log(chalk.dim(` Violations: ${result.violations.map(v => v.rule).join(', ')}`));
203
+ }
204
+ }
205
+ }
206
+ console.log();
207
+ console.log(chalk.bold('Results:'));
208
+ console.log(` ${chalk.green(`${passed} passed`)}, ${chalk.red(`${failed} failed`)}, ${tests.length} total`);
209
+ }
210
+ process.exit(failed > 0 ? 1 : 0);
211
+ }
212
+ catch (error) {
213
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
214
+ process.exit(1);
215
+ }
216
+ });
217
+ /**
218
+ * List packs command
219
+ */
220
+ program
221
+ .command('packs')
222
+ .description('List available style packs')
223
+ .action(async () => {
224
+ try {
225
+ const packs = await listAvailablePacks();
226
+ console.log(chalk.bold('Available packs:'));
227
+ for (const packName of packs) {
228
+ console.log(` - ${packName}`);
229
+ }
230
+ }
231
+ catch (error) {
232
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
233
+ process.exit(1);
234
+ }
235
+ });
236
+ /**
237
+ * Inspect command - show pack details
238
+ */
239
+ program
240
+ .command('inspect')
241
+ .description('Inspect a style pack')
242
+ .option('-p, --pack <name>', 'Style pack to inspect', 'saas')
243
+ .option('-s, --section <section>', 'Section to show (voice, patterns, ctas, tokens)')
244
+ .action(async (options) => {
245
+ try {
246
+ const packPath = join(getPacksDirectory(), options.pack);
247
+ const { pack, errors } = await loadPack({ packPath });
248
+ if (errors.length > 0) {
249
+ console.error(chalk.yellow('Pack warnings:'), errors.join(', '));
250
+ }
251
+ if (options.section) {
252
+ switch (options.section) {
253
+ case 'voice':
254
+ console.log(JSON.stringify(pack.voice, null, 2));
255
+ break;
256
+ case 'patterns':
257
+ console.log(JSON.stringify(pack.copyPatterns, null, 2));
258
+ break;
259
+ case 'ctas':
260
+ console.log(JSON.stringify(pack.ctaRules, null, 2));
261
+ break;
262
+ case 'tokens':
263
+ console.log(JSON.stringify(pack.tokens, null, 2));
264
+ break;
265
+ default:
266
+ console.error(chalk.red(`Unknown section: ${options.section}`));
267
+ process.exit(1);
268
+ }
269
+ }
270
+ else {
271
+ console.log(chalk.bold(`Pack: ${pack.manifest.name} v${pack.manifest.version}`));
272
+ console.log(chalk.dim(pack.manifest.description || ''));
273
+ console.log();
274
+ console.log(`Voice: ${pack.voice.name}`);
275
+ console.log(` Tone: ${pack.voice.tone.summary || 'Not specified'}`);
276
+ console.log(` Vocabulary rules: ${pack.voice.vocabulary.rules.length}`);
277
+ console.log(` Forbidden phrases: ${pack.voice.vocabulary.forbidden.length}`);
278
+ console.log(` Do-not patterns: ${pack.voice.doNot.length}`);
279
+ console.log(` Examples: ${pack.voice.examples.length}`);
280
+ console.log();
281
+ console.log(`Copy patterns: ${pack.copyPatterns.patterns.length}`);
282
+ console.log(`CTA categories: ${pack.ctaRules.categories.length}`);
283
+ console.log(`Tests: ${pack.tests.tests.length}`);
284
+ }
285
+ }
286
+ catch (error) {
287
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
288
+ process.exit(1);
289
+ }
290
+ });
291
+ /**
292
+ * Server command - start MCP server
293
+ */
294
+ program
295
+ .command('serve')
296
+ .description('Start the MCP server (stdio)')
297
+ .action(async () => {
298
+ // Dynamic import to avoid loading server code for other commands
299
+ await import('../server/index.js');
300
+ });
301
+ /**
302
+ * Print validation result in a readable format
303
+ */
304
+ function printValidationResult(result) {
305
+ const scoreColor = result.score >= 80 ? chalk.green : result.score >= 60 ? chalk.yellow : chalk.red;
306
+ const statusIcon = result.valid ? chalk.green('✓') : chalk.red('✗');
307
+ console.log();
308
+ console.log(`${statusIcon} Score: ${scoreColor(result.score.toString())}/100`);
309
+ console.log();
310
+ if (result.violations.length === 0) {
311
+ console.log(chalk.green('No violations found.'));
312
+ }
313
+ else {
314
+ console.log(chalk.bold(`Violations (${result.violations.length}):`));
315
+ console.log();
316
+ for (const violation of result.violations) {
317
+ const icon = violation.severity === 'error'
318
+ ? chalk.red('✗')
319
+ : violation.severity === 'warning'
320
+ ? chalk.yellow('⚠')
321
+ : chalk.blue('ℹ');
322
+ console.log(`${icon} ${violation.message}`);
323
+ if (violation.text) {
324
+ console.log(chalk.dim(` Text: "${violation.text}"`));
325
+ }
326
+ if (violation.suggestion) {
327
+ console.log(chalk.cyan(` Suggestion: ${violation.suggestion}`));
328
+ }
329
+ console.log();
330
+ }
331
+ }
332
+ console.log(chalk.dim(`Pack: ${result.metadata.packName} v${result.metadata.packVersion}`));
333
+ }
334
+ program.parse();
335
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './schema/index.js';
2
+ export { validate, ValidateOptions, ValidatorConfig } from './validator/index.js';
3
+ export { rewrite, rewriteMinimal, rewriteAggressive, formatChanges, generateDiff, RewriteOptions, } from './rewriter/index.js';
4
+ export { loadPack, LoadPackOptions, PackLoadResult, getPacksDirectory, listAvailablePacks, } from './utils/pack-loader.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGlF,OAAO,EACL,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,QAAQ,EACR,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ // StyleMCP - Executable brand rules for models and agents
2
+ // Schema exports
3
+ export * from './schema/index.js';
4
+ // Validator exports
5
+ export { validate } from './validator/index.js';
6
+ // Rewriter exports
7
+ export { rewrite, rewriteMinimal, rewriteAggressive, formatChanges, generateDiff, } from './rewriter/index.js';
8
+ // Pack loader exports
9
+ export { loadPack, getPacksDirectory, listAvailablePacks, } from './utils/pack-loader.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,iBAAiB;AACjB,cAAc,mBAAmB,CAAC;AAElC,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAoC,MAAM,sBAAsB,CAAC;AAElF,mBAAmB;AACnB,OAAO,EACL,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAE7B,sBAAsB;AACtB,OAAO,EACL,QAAQ,EAGR,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { Pack, RewriteResult } from '../schema/index.js';
2
+ export interface RewriteOptions {
3
+ pack: Pack;
4
+ text: string;
5
+ context?: {
6
+ type?: 'ui-copy' | 'marketing' | 'docs' | 'support' | 'general';
7
+ component?: string;
8
+ };
9
+ /** Only apply fixes for these severity levels */
10
+ fixSeverity?: ('error' | 'warning' | 'info')[];
11
+ /** Maximum number of changes to apply */
12
+ maxChanges?: number;
13
+ }
14
+ export interface Change {
15
+ type: 'replace' | 'insert' | 'delete';
16
+ original: string;
17
+ replacement: string;
18
+ reason: string;
19
+ position: {
20
+ start: number;
21
+ end: number;
22
+ };
23
+ }
24
+ /**
25
+ * Rewrite text to conform to style rules
26
+ * Makes minimal changes based on detected violations
27
+ */
28
+ export declare function rewrite(options: RewriteOptions): RewriteResult;
29
+ /**
30
+ * Apply minimal rewrites - only fix errors, leave warnings as-is
31
+ */
32
+ export declare function rewriteMinimal(options: Omit<RewriteOptions, 'fixSeverity'>): RewriteResult;
33
+ /**
34
+ * Apply aggressive rewrites - fix everything including info-level issues
35
+ */
36
+ export declare function rewriteAggressive(options: Omit<RewriteOptions, 'fixSeverity'>): RewriteResult;
37
+ /**
38
+ * Generate a diff-like view of changes
39
+ */
40
+ export declare function formatChanges(result: RewriteResult): string;
41
+ /**
42
+ * Generate a unified diff format
43
+ */
44
+ export declare function generateDiff(result: RewriteResult): string;
45
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rewriter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAA+B,MAAM,oBAAoB,CAAC;AAGtF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;QAChE,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,iDAAiD;IACjD,WAAW,CAAC,EAAE,CAAC,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;IAC/C,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAmG9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,aAAa,CAE1F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,aAAa,CAE7F;AA0BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAiB3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAyB1D"}
@@ -0,0 +1,163 @@
1
+ import { validate } from '../validator/index.js';
2
+ /**
3
+ * Rewrite text to conform to style rules
4
+ * Makes minimal changes based on detected violations
5
+ */
6
+ export function rewrite(options) {
7
+ const { pack, text, context, fixSeverity = ['error', 'warning'], maxChanges = 50, } = options;
8
+ // First, validate to get violations
9
+ const validation = validate({ pack, text, context });
10
+ // Filter violations that match severity and have positions
11
+ const candidateViolations = validation.violations
12
+ .filter(v => fixSeverity.includes(v.severity))
13
+ .filter(v => v.position);
14
+ // Dedupe violations at the same position (keep the one with best fixability)
15
+ const positionMap = new Map();
16
+ for (const v of candidateViolations) {
17
+ const key = `${v.position.start}-${v.position.end}`;
18
+ const existing = positionMap.get(key);
19
+ if (!existing) {
20
+ positionMap.set(key, v);
21
+ }
22
+ else {
23
+ // Prefer vocabulary.preferred (auto-fixable) over vocabulary.forbidden
24
+ if (v.rule === 'vocabulary.preferred' && existing.rule === 'vocabulary.forbidden') {
25
+ positionMap.set(key, v);
26
+ }
27
+ // Otherwise keep the existing (first one found)
28
+ }
29
+ }
30
+ const fixableViolations = Array.from(positionMap.values()).slice(0, maxChanges);
31
+ // Sort by position (descending) so we can apply changes from end to start
32
+ // This prevents position shifts from affecting subsequent changes
33
+ const sortedViolations = [...fixableViolations].sort((a, b) => (b.position?.start || 0) - (a.position?.start || 0));
34
+ let rewritten = text;
35
+ const changes = [];
36
+ for (const violation of sortedViolations) {
37
+ if (!violation.position)
38
+ continue;
39
+ const { start, end } = violation.position;
40
+ const original = rewritten.slice(start, end);
41
+ // Determine replacement based on violation type
42
+ let replacement = null;
43
+ if (violation.rule === 'vocabulary.preferred' && violation.suggestion) {
44
+ // For vocabulary preferences, the suggestion is the preferred word
45
+ replacement = matchCase(original, violation.suggestion);
46
+ }
47
+ else if (violation.rule === 'vocabulary.forbidden') {
48
+ // For forbidden words, we can't just replace - we need manual review
49
+ // Skip auto-fixing forbidden words
50
+ continue;
51
+ }
52
+ else if (violation.rule.startsWith('doNot.') || violation.rule.startsWith('cta.')) {
53
+ // For doNot patterns and CTA issues, we usually can't auto-fix
54
+ // These need human review
55
+ continue;
56
+ }
57
+ else {
58
+ // For other violations, skip if we can't determine a safe replacement
59
+ continue;
60
+ }
61
+ if (replacement === null)
62
+ continue;
63
+ // Apply the change
64
+ rewritten = rewritten.slice(0, start) + replacement + rewritten.slice(end);
65
+ changes.push({
66
+ type: replacement === '' ? 'delete' : 'replace',
67
+ original,
68
+ replacement,
69
+ reason: violation.message,
70
+ position: { start, end },
71
+ });
72
+ }
73
+ // Re-validate to get new score
74
+ const afterValidation = validate({ pack, text: rewritten, context });
75
+ // Reverse changes array so it's in document order
76
+ changes.reverse();
77
+ return {
78
+ original: text,
79
+ rewritten,
80
+ changes,
81
+ score: {
82
+ before: validation.score,
83
+ after: afterValidation.score,
84
+ },
85
+ };
86
+ }
87
+ /**
88
+ * Apply minimal rewrites - only fix errors, leave warnings as-is
89
+ */
90
+ export function rewriteMinimal(options) {
91
+ return rewrite({ ...options, fixSeverity: ['error'] });
92
+ }
93
+ /**
94
+ * Apply aggressive rewrites - fix everything including info-level issues
95
+ */
96
+ export function rewriteAggressive(options) {
97
+ return rewrite({ ...options, fixSeverity: ['error', 'warning', 'info'] });
98
+ }
99
+ /**
100
+ * Match the case pattern of the original word
101
+ */
102
+ function matchCase(original, replacement) {
103
+ if (!original || !replacement)
104
+ return replacement;
105
+ // All uppercase
106
+ if (original === original.toUpperCase()) {
107
+ return replacement.toUpperCase();
108
+ }
109
+ // Title case (first letter uppercase)
110
+ if (original[0] === original[0].toUpperCase()) {
111
+ return replacement.charAt(0).toUpperCase() + replacement.slice(1).toLowerCase();
112
+ }
113
+ // All lowercase
114
+ if (original === original.toLowerCase()) {
115
+ return replacement.toLowerCase();
116
+ }
117
+ return replacement;
118
+ }
119
+ /**
120
+ * Generate a diff-like view of changes
121
+ */
122
+ export function formatChanges(result) {
123
+ if (result.changes.length === 0) {
124
+ return 'No changes made.';
125
+ }
126
+ const lines = [
127
+ `Score: ${result.score.before} → ${result.score.after}`,
128
+ '',
129
+ 'Changes:',
130
+ ];
131
+ for (const change of result.changes) {
132
+ lines.push(` - "${change.original}" → "${change.replacement}"`);
133
+ lines.push(` Reason: ${change.reason}`);
134
+ }
135
+ return lines.join('\n');
136
+ }
137
+ /**
138
+ * Generate a unified diff format
139
+ */
140
+ export function generateDiff(result) {
141
+ const lines = [];
142
+ // Simple line-by-line diff
143
+ const originalLines = result.original.split('\n');
144
+ const rewrittenLines = result.rewritten.split('\n');
145
+ lines.push('--- original');
146
+ lines.push('+++ rewritten');
147
+ const maxLines = Math.max(originalLines.length, rewrittenLines.length);
148
+ for (let i = 0; i < maxLines; i++) {
149
+ const orig = originalLines[i] || '';
150
+ const rewr = rewrittenLines[i] || '';
151
+ if (orig !== rewr) {
152
+ if (orig)
153
+ lines.push(`- ${orig}`);
154
+ if (rewr)
155
+ lines.push(`+ ${rewr}`);
156
+ }
157
+ else if (orig) {
158
+ lines.push(` ${orig}`);
159
+ }
160
+ }
161
+ return lines.join('\n');
162
+ }
163
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rewriter/index.ts"],"names":[],"mappings":"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"}