@schnick371/devsteps-shared 1.1.0-next.2 → 1.1.0-next.3

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 (38) hide show
  1. package/dist/core/add.d.ts.map +1 -1
  2. package/dist/core/add.js +4 -3
  3. package/dist/core/add.js.map +1 -1
  4. package/dist/core/context.d.ts +44 -0
  5. package/dist/core/context.d.ts.map +1 -1
  6. package/dist/core/context.js +326 -1
  7. package/dist/core/context.js.map +1 -1
  8. package/dist/core/context.test.d.ts +10 -0
  9. package/dist/core/context.test.d.ts.map +1 -0
  10. package/dist/core/context.test.js +239 -0
  11. package/dist/core/context.test.js.map +1 -0
  12. package/dist/core/index.d.ts +1 -1
  13. package/dist/core/index.d.ts.map +1 -1
  14. package/dist/core/index.js +1 -1
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/core/update.js +4 -4
  17. package/dist/core/update.js.map +1 -1
  18. package/dist/utils/backup-github-files.d.ts +34 -0
  19. package/dist/utils/backup-github-files.d.ts.map +1 -0
  20. package/dist/utils/backup-github-files.js +137 -0
  21. package/dist/utils/backup-github-files.js.map +1 -0
  22. package/dist/utils/index.d.ts +25 -1
  23. package/dist/utils/index.d.ts.map +1 -1
  24. package/dist/utils/index.js +36 -1
  25. package/dist/utils/index.js.map +1 -1
  26. package/dist/utils/init-helpers.d.ts +14 -1
  27. package/dist/utils/init-helpers.d.ts.map +1 -1
  28. package/dist/utils/init-helpers.js +37 -2
  29. package/dist/utils/init-helpers.js.map +1 -1
  30. package/dist/utils/normalize.test.d.ts +15 -0
  31. package/dist/utils/normalize.test.d.ts.map +1 -0
  32. package/dist/utils/normalize.test.js +101 -0
  33. package/dist/utils/normalize.test.js.map +1 -0
  34. package/dist/utils/update-copilot-files.d.ts +59 -0
  35. package/dist/utils/update-copilot-files.d.ts.map +1 -0
  36. package/dist/utils/update-copilot-files.js +183 -0
  37. package/dist/utils/update-copilot-files.js.map +1 -0
  38. package/package.json +1 -1
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Tests for context generation — quick/standard levels, context_meta, generateProjectMd
6
+ *
7
+ * @see STORY-121 TASK-273, TASK-276
8
+ */
9
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
10
+ import { tmpdir } from 'node:os';
11
+ import path from 'node:path';
12
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
13
+ import { buildContextMeta, formatContextAsText, generateProjectMd, getQuickContext, getStandardContext, } from './context.js';
14
+ // ─── Test fixtures ────────────────────────────────────────────────────────────
15
+ function makeIndex(items) {
16
+ return JSON.stringify({
17
+ version: '2.0.0',
18
+ items,
19
+ });
20
+ }
21
+ function makeItem(id, type, status) {
22
+ return { id, type, title: `${type} ${id}`, status, updated: new Date().toISOString() };
23
+ }
24
+ let tmpDir;
25
+ let projectDir;
26
+ let devstepsDir;
27
+ beforeEach(() => {
28
+ tmpDir = mkdtempSync(path.join(tmpdir(), 'devsteps-ctx-test-'));
29
+ projectDir = tmpDir;
30
+ devstepsDir = path.join(tmpDir, '.devsteps');
31
+ mkdirSync(devstepsDir, { recursive: true });
32
+ // Minimal index
33
+ writeFileSync(path.join(devstepsDir, 'index.json'), makeIndex([
34
+ makeItem('STORY-001', 'story', 'in-progress'),
35
+ makeItem('TASK-001', 'task', 'planned'),
36
+ makeItem('TASK-002', 'task', 'done'),
37
+ makeItem('BUG-001', 'bug', 'blocked'),
38
+ ]));
39
+ });
40
+ afterEach(() => {
41
+ rmSync(tmpDir, { recursive: true, force: true });
42
+ });
43
+ // ─── getQuickContext ──────────────────────────────────────────────────────────
44
+ describe('getQuickContext', () => {
45
+ it('returns success with correct context_level', async () => {
46
+ const ctx = await getQuickContext(projectDir, devstepsDir);
47
+ expect(ctx.context_level).toBe('quick');
48
+ });
49
+ it('includes active_items counts', async () => {
50
+ const ctx = await getQuickContext(projectDir, devstepsDir);
51
+ expect(ctx.dynamic_context.active_items.total).toBe(4);
52
+ expect(ctx.dynamic_context.active_items.by_type.story).toBe(1);
53
+ expect(ctx.dynamic_context.active_items.by_status.done).toBe(1);
54
+ });
55
+ it('includes context_meta', async () => {
56
+ const ctx = await getQuickContext(projectDir, devstepsDir);
57
+ expect(ctx.context_meta).toBeDefined();
58
+ expect(ctx.context_meta.level).toBe('quick');
59
+ expect(typeof ctx.context_meta.generated_at).toBe('string');
60
+ expect(typeof ctx.context_meta.project_md_age_hours).toBe('number');
61
+ expect(typeof ctx.context_meta.is_stale).toBe('boolean');
62
+ expect(typeof ctx.context_meta.cache_hit).toBe('boolean');
63
+ });
64
+ it('context_meta.is_stale true when PROJECT.md missing', async () => {
65
+ const ctx = await getQuickContext(projectDir, devstepsDir);
66
+ // PROJECT.md not written in beforeEach — should be stale (Infinity age)
67
+ expect(ctx.context_meta.is_stale).toBe(true);
68
+ expect(ctx.context_meta.project_md_age_hours).toBe(Number.POSITIVE_INFINITY);
69
+ });
70
+ it('context_meta.is_stale false when PROJECT.md is fresh', async () => {
71
+ writeFileSync(path.join(devstepsDir, 'PROJECT.md'), '# Test', 'utf-8');
72
+ const ctx = await getQuickContext(projectDir, devstepsDir);
73
+ expect(ctx.context_meta.is_stale).toBe(false);
74
+ expect(ctx.context_meta.project_md_age_hours).toBeLessThan(1);
75
+ });
76
+ it('includes suggestions when PROJECT.md missing', async () => {
77
+ const ctx = await getQuickContext(projectDir, devstepsDir);
78
+ expect(ctx.suggestions).toBeDefined();
79
+ expect(ctx.suggestions.some((s) => s.includes('devsteps context generate'))).toBe(true);
80
+ });
81
+ it('includes suggestions for blocked items', async () => {
82
+ const ctx = await getQuickContext(projectDir, devstepsDir);
83
+ expect(ctx.suggestions.some((s) => s.includes('blocked'))).toBe(true);
84
+ });
85
+ it('tokens_used is positive', async () => {
86
+ const ctx = await getQuickContext(projectDir, devstepsDir);
87
+ expect(ctx.tokens_used).toBeGreaterThan(0);
88
+ });
89
+ });
90
+ // ─── getStandardContext ───────────────────────────────────────────────────────
91
+ describe('getStandardContext', () => {
92
+ it('returns context_level standard', async () => {
93
+ const ctx = await getStandardContext(projectDir, devstepsDir);
94
+ expect(ctx.context_level).toBe('standard');
95
+ });
96
+ it('includes context_meta with level standard', async () => {
97
+ const ctx = await getStandardContext(projectDir, devstepsDir);
98
+ expect(ctx.context_meta).toBeDefined();
99
+ expect(ctx.context_meta.level).toBe('standard');
100
+ });
101
+ it('standard context includes open_items_count in dynamic_context', async () => {
102
+ const ctx = await getStandardContext(projectDir, devstepsDir);
103
+ // 4 items total, 3 non-done (in-progress, planned, blocked)
104
+ const dc = ctx.dynamic_context;
105
+ expect(dc.open_items_count).toBeDefined();
106
+ expect(dc.open_items_count).toBeGreaterThanOrEqual(3);
107
+ });
108
+ it('standard context includes in_progress array', async () => {
109
+ const ctx = await getStandardContext(projectDir, devstepsDir);
110
+ const dc = ctx.dynamic_context;
111
+ expect(dc.in_progress).toBeDefined();
112
+ expect(dc.in_progress.some((i) => i.id === 'STORY-001')).toBe(true);
113
+ });
114
+ it('standard context includes blocking_items array', async () => {
115
+ const ctx = await getStandardContext(projectDir, devstepsDir);
116
+ const dc = ctx.dynamic_context;
117
+ expect(dc.blocking_items).toBeDefined();
118
+ expect(dc.blocking_items.some((i) => i.id === 'BUG-001')).toBe(true);
119
+ });
120
+ it('tokens_used is positive and larger than quick', async () => {
121
+ const quick = await getQuickContext(projectDir, devstepsDir);
122
+ const standard = await getStandardContext(projectDir, devstepsDir);
123
+ expect(standard.tokens_used).toBeGreaterThan(0);
124
+ // Standard should be at least as many tokens as quick
125
+ expect(standard.tokens_used).toBeGreaterThanOrEqual(quick.tokens_used);
126
+ });
127
+ });
128
+ // ─── buildContextMeta ────────────────────────────────────────────────────────
129
+ describe('buildContextMeta', () => {
130
+ it('returns is_stale true when PROJECT.md missing', async () => {
131
+ const meta = await buildContextMeta(devstepsDir, 'quick', false);
132
+ expect(meta.is_stale).toBe(true);
133
+ });
134
+ it('returns is_stale false when PROJECT.md fresh', async () => {
135
+ writeFileSync(path.join(devstepsDir, 'PROJECT.md'), '# test', 'utf-8');
136
+ const meta = await buildContextMeta(devstepsDir, 'quick', false);
137
+ expect(meta.is_stale).toBe(false);
138
+ });
139
+ it('returns correct level', async () => {
140
+ const meta = await buildContextMeta(devstepsDir, 'standard', true);
141
+ expect(meta.level).toBe('standard');
142
+ expect(meta.cache_hit).toBe(true);
143
+ });
144
+ it('generated_at is valid ISO date', async () => {
145
+ const meta = await buildContextMeta(devstepsDir, 'quick', false);
146
+ expect(new Date(meta.generated_at).getTime()).not.toBeNaN();
147
+ });
148
+ });
149
+ // ─── formatContextAsText ─────────────────────────────────────────────────────
150
+ describe('formatContextAsText', () => {
151
+ it('produces non-empty markdown string', async () => {
152
+ const ctx = await getQuickContext(projectDir, devstepsDir);
153
+ const text = formatContextAsText(ctx);
154
+ expect(typeof text).toBe('string');
155
+ expect(text.length).toBeGreaterThan(50);
156
+ });
157
+ it('contains project status section', async () => {
158
+ const ctx = await getQuickContext(projectDir, devstepsDir);
159
+ const text = formatContextAsText(ctx);
160
+ expect(text).toContain('## Project Status');
161
+ expect(text).toContain('Total items: 4');
162
+ });
163
+ it('contains DevSteps Conventions section', async () => {
164
+ const ctx = await getQuickContext(projectDir, devstepsDir);
165
+ const text = formatContextAsText(ctx);
166
+ expect(text).toContain('## DevSteps Conventions');
167
+ expect(text).toContain('.devsteps/');
168
+ });
169
+ it('includes stale warning when is_stale', async () => {
170
+ // PROJECT.md missing => is_stale
171
+ const ctx = await getQuickContext(projectDir, devstepsDir);
172
+ const text = formatContextAsText(ctx);
173
+ expect(text).toContain('stale');
174
+ expect(text).toContain('devsteps context generate');
175
+ });
176
+ it('no stale warning when PROJECT.md fresh', async () => {
177
+ writeFileSync(path.join(devstepsDir, 'PROJECT.md'), '# test', 'utf-8');
178
+ const ctx = await getQuickContext(projectDir, devstepsDir);
179
+ const text = formatContextAsText(ctx);
180
+ expect(text).not.toContain('stale');
181
+ });
182
+ });
183
+ // ─── generateProjectMd ───────────────────────────────────────────────────────
184
+ describe('generateProjectMd', () => {
185
+ beforeEach(() => {
186
+ // Write a minimal config.json
187
+ writeFileSync(path.join(devstepsDir, 'config.json'), JSON.stringify({
188
+ project_name: 'test-project',
189
+ settings: { methodology: 'scrum' },
190
+ created: new Date().toISOString(),
191
+ }), 'utf-8');
192
+ });
193
+ it('produces markdown starting with project name', async () => {
194
+ const md = await generateProjectMd(projectDir, devstepsDir);
195
+ expect(md).toMatch(/^# test-project/);
196
+ });
197
+ it('contains Project Type section', async () => {
198
+ const md = await generateProjectMd(projectDir, devstepsDir);
199
+ expect(md).toContain('## Project Type');
200
+ expect(md).toContain('Scrum');
201
+ });
202
+ it('contains Status section with item counts', async () => {
203
+ const md = await generateProjectMd(projectDir, devstepsDir);
204
+ expect(md).toContain('## Status');
205
+ expect(md).toContain('Total items: 4');
206
+ });
207
+ it('contains Conventions section', async () => {
208
+ const md = await generateProjectMd(projectDir, devstepsDir);
209
+ expect(md).toContain('## Conventions');
210
+ expect(md).toContain('.devsteps/');
211
+ });
212
+ it('ends with generation timestamp', async () => {
213
+ const md = await generateProjectMd(projectDir, devstepsDir);
214
+ expect(md).toContain('_Generated by');
215
+ expect(md).toContain('devsteps context generate');
216
+ });
217
+ it('reads description from README.md when no config description', async () => {
218
+ writeFileSync(path.join(projectDir, 'README.md'), '# Test\n\nThis is the first paragraph.', 'utf-8');
219
+ const md = await generateProjectMd(projectDir, devstepsDir);
220
+ expect(md).toContain('This is the first paragraph.');
221
+ });
222
+ it('includes package structure when packages/ dir exists', async () => {
223
+ const pkgDir = path.join(projectDir, 'packages', 'mypkg');
224
+ mkdirSync(pkgDir, { recursive: true });
225
+ writeFileSync(path.join(pkgDir, 'package.json'), JSON.stringify({ name: '@test/mypkg', description: 'My test package' }), 'utf-8');
226
+ const md = await generateProjectMd(projectDir, devstepsDir);
227
+ expect(md).toContain('## Package Structure');
228
+ expect(md).toContain('@test/mypkg');
229
+ expect(md).toContain('My test package');
230
+ });
231
+ it('works when config.json is missing (graceful fallback)', async () => {
232
+ rmSync(path.join(devstepsDir, 'config.json'));
233
+ const md = await generateProjectMd(projectDir, devstepsDir);
234
+ // Should not throw — uses directory name as project name
235
+ expect(md).toBeDefined();
236
+ expect(md.startsWith('#')).toBe(true);
237
+ });
238
+ });
239
+ //# sourceMappingURL=context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../src/core/context.test.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export { type ArchiveItemResult, archiveItem, type PurgeItemsArgs, type PurgeIte
10
10
  export { type AutoMigrationOptions, checkMigrationNeeded, ensureFullMigration, ensureIndexMigrated, getMigrationStatusMessage, type MigrationCheckResult, type MigrationStats, migrateItemsDirectory, needsItemsDirectoryMigration, performMigration, } from './auto-migrate.js';
11
11
  export { type BulkUpdateResult, bulkAddTags, bulkRemoveTags, bulkUpdateItems, } from './bulk-update.js';
12
12
  export { getConfig } from './config.js';
13
- export { analyzePackages, estimateTokens, getItemCounts, getQuickContext, getRecentUpdates, readProjectMd, } from './context.js';
13
+ export { analyzePackages, buildContextMeta, type ContextMeta, estimateTokens, formatContextAsText, generateProjectMd, getItemCounts, getQuickContext, getRecentUpdates, getStandardContext, readProjectMd, } from './context.js';
14
14
  export { type GetItemResult, getItem } from './get.js';
15
15
  export { type RebuildOptions, type RebuildResult, rebuildIndex, } from './index-rebuild.js';
16
16
  export * from './index-refs.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EACL,KAAK,iBAAiB,EACtB,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,gBAAgB,EACrB,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EACL,KAAK,gBAAgB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,QAAQ,GACd,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EACL,KAAK,iBAAiB,EACtB,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,gBAAgB,EACrB,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,KAAK,WAAW,EAChB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EACL,KAAK,gBAAgB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,QAAQ,GACd,MAAM,iBAAiB,CAAC"}
@@ -11,7 +11,7 @@ export { archiveItem, purgeItems, } from './archive.js';
11
11
  export { checkMigrationNeeded, ensureFullMigration, ensureIndexMigrated, getMigrationStatusMessage, migrateItemsDirectory, needsItemsDirectoryMigration, performMigration, } from './auto-migrate.js';
12
12
  export { bulkAddTags, bulkRemoveTags, bulkUpdateItems, } from './bulk-update.js';
13
13
  export { getConfig } from './config.js';
14
- export { analyzePackages, estimateTokens, getItemCounts, getQuickContext, getRecentUpdates, readProjectMd, } from './context.js';
14
+ export { analyzePackages, buildContextMeta, estimateTokens, formatContextAsText, generateProjectMd, getItemCounts, getQuickContext, getRecentUpdates, getStandardContext, readProjectMd, } from './context.js';
15
15
  export { getItem } from './get.js';
16
16
  // Index rebuild operations
17
17
  export { rebuildIndex, } from './index-rebuild.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAwC,OAAO,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAEL,WAAW,EAGX,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,uCAAuC;AACvC,OAAO,EAEL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EAGzB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAsB,OAAO,EAAE,MAAM,UAAU,CAAC;AACvD,2BAA2B;AAC3B,OAAO,EAGL,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,8BAA8B;AAC9B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAA4C,SAAS,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAA0C,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAGL,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAA8C,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,GAErB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAwC,OAAO,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAEL,WAAW,EAGX,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,uCAAuC;AACvC,OAAO,EAEL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EAGzB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,gBAAgB,EAEhB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAsB,OAAO,EAAE,MAAM,UAAU,CAAC;AACvD,2BAA2B;AAC3B,OAAO,EAGL,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,8BAA8B;AAC9B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAA4C,SAAS,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAA0C,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAGL,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAA8C,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,GAErB,MAAM,iBAAiB,CAAC"}
@@ -8,7 +8,7 @@
8
8
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
9
9
  import { join } from 'node:path';
10
10
  import { RELATIONSHIP_TYPE, STATUS } from '../constants/index.js';
11
- import { getCurrentTimestamp, parseItemId, TYPE_TO_DIRECTORY } from '../utils/index.js';
11
+ import { getCurrentTimestamp, normalizeMarkdown, parseItemId, TYPE_TO_DIRECTORY } from '../utils/index.js';
12
12
  import { getItem } from './get.js';
13
13
  import { updateItemInIndex } from './index-refs.js';
14
14
  /**
@@ -91,13 +91,13 @@ export async function updateItem(devstepsDir, args) {
91
91
  throw new Error('Cannot use both description and append_description simultaneously');
92
92
  }
93
93
  if (args.description) {
94
- // Replace entire description
95
- writeFileSync(descriptionPath, args.description);
94
+ // Replace entire description — normalize escape sequences from MCP clients (BUG-056)
95
+ writeFileSync(descriptionPath, normalizeMarkdown(args.description));
96
96
  }
97
97
  else if (args.append_description) {
98
98
  // Append to existing (or create new if doesn't exist)
99
99
  const existing = existsSync(descriptionPath) ? readFileSync(descriptionPath, 'utf-8') : '';
100
- writeFileSync(descriptionPath, existing + args.append_description);
100
+ writeFileSync(descriptionPath, existing + normalizeMarkdown(args.append_description));
101
101
  }
102
102
  // Update index (auto-migration ensures refs-style always available)
103
103
  // Only update if status or eisenhower changed (triggers re-indexing)
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/core/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * GitHub Copilot file backup utilities
6
+ * Creates timestamped backups of devsteps-managed .github files before updates.
7
+ */
8
+ export interface BackupResult {
9
+ success: boolean;
10
+ backupDir: string;
11
+ timestamp: string;
12
+ fileCount: number;
13
+ files: string[];
14
+ error?: Error;
15
+ }
16
+ export interface BackupOptions {
17
+ /** Maximum number of backups to retain (default: 5) */
18
+ maxBackups?: number;
19
+ /** DevSteps package version for manifest */
20
+ packageVersion?: string;
21
+ /** Skip backup entirely (dry-run / test mode) */
22
+ skip?: boolean;
23
+ }
24
+ /**
25
+ * Create a timestamped backup of all devsteps-managed .github files.
26
+ *
27
+ * Backup location: `<devstepsDir>/backups/github-<timestamp>/`
28
+ * A `manifest.json` is written alongside the backed-up files.
29
+ *
30
+ * On any error the partially-created backup directory is cleaned up
31
+ * and `success: false` is returned — callers must abort the update.
32
+ */
33
+ export declare function backupGithubFiles(githubDir: string, devstepsDir: string, options?: BackupOptions): BackupResult;
34
+ //# sourceMappingURL=backup-github-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-github-files.d.ts","sourceRoot":"","sources":["../../src/utils/backup-github-files.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA8DD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY,CA6Ed"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * GitHub Copilot file backup utilities
6
+ * Creates timestamped backups of devsteps-managed .github files before updates.
7
+ */
8
+ import { createHash } from 'node:crypto';
9
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync, } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ const DEFAULT_MAX_BACKUPS = 5;
12
+ const BACKUP_DIR_PREFIX = 'github-';
13
+ /**
14
+ * Compute sha256 hex digest of a string.
15
+ */
16
+ function sha256(content) {
17
+ return createHash('sha256').update(content, 'utf8').digest('hex');
18
+ }
19
+ /**
20
+ * Format a Date as a filesystem-safe ISO timestamp: YYYY-MM-DDTHH-MM-SS
21
+ */
22
+ function formatTimestamp(date) {
23
+ return date
24
+ .toISOString()
25
+ .replace(/\.\d{3}Z$/, '')
26
+ .replace(/:/g, '-');
27
+ }
28
+ /**
29
+ * Collect all devsteps-managed .github files from the three subdirectories.
30
+ * Returns an array of { rel, abs } objects where rel is the subdirectory-relative path.
31
+ */
32
+ function collectManagedFiles(githubDir) {
33
+ const subdirs = ['agents', 'instructions', 'prompts'];
34
+ const collected = [];
35
+ for (const sub of subdirs) {
36
+ const dir = join(githubDir, sub);
37
+ if (!existsSync(dir))
38
+ continue;
39
+ const files = readdirSync(dir).filter((f) => f.startsWith('devsteps') && (f.endsWith('.agent.md') || f.endsWith('.instructions.md') || f.endsWith('.prompt.md')));
40
+ for (const file of files) {
41
+ collected.push({ rel: join(sub, file), abs: join(dir, file) });
42
+ }
43
+ }
44
+ return collected;
45
+ }
46
+ /**
47
+ * Remove oldest backup directories, keeping only `maxBackups` most recent.
48
+ */
49
+ function pruneOldBackups(backupsRoot, maxBackups) {
50
+ if (!existsSync(backupsRoot))
51
+ return;
52
+ const entries = readdirSync(backupsRoot)
53
+ .filter((d) => d.startsWith(BACKUP_DIR_PREFIX))
54
+ .sort(); // ISO-ish timestamps sort lexicographically
55
+ const toRemove = entries.slice(0, Math.max(0, entries.length - maxBackups));
56
+ for (const dir of toRemove) {
57
+ rmSync(join(backupsRoot, dir), { recursive: true, force: true });
58
+ }
59
+ }
60
+ /**
61
+ * Create a timestamped backup of all devsteps-managed .github files.
62
+ *
63
+ * Backup location: `<devstepsDir>/backups/github-<timestamp>/`
64
+ * A `manifest.json` is written alongside the backed-up files.
65
+ *
66
+ * On any error the partially-created backup directory is cleaned up
67
+ * and `success: false` is returned — callers must abort the update.
68
+ */
69
+ export function backupGithubFiles(githubDir, devstepsDir, options) {
70
+ const maxBackups = options?.maxBackups ?? DEFAULT_MAX_BACKUPS;
71
+ const packageVersion = options?.packageVersion ?? 'unknown';
72
+ const timestamp = formatTimestamp(new Date());
73
+ if (options?.skip) {
74
+ return { success: true, backupDir: '', timestamp, fileCount: 0, files: [] };
75
+ }
76
+ const backupsRoot = join(devstepsDir, 'backups');
77
+ const backupDir = join(backupsRoot, `${BACKUP_DIR_PREFIX}${timestamp}`);
78
+ let partiallyCreated = false;
79
+ try {
80
+ const managedFiles = collectManagedFiles(githubDir);
81
+ if (managedFiles.length === 0) {
82
+ // Nothing to back up — not an error
83
+ return { success: true, backupDir: '', timestamp, fileCount: 0, files: [] };
84
+ }
85
+ // Create backup directory structure
86
+ mkdirSync(join(backupDir, 'agents'), { recursive: true });
87
+ mkdirSync(join(backupDir, 'instructions'), { recursive: true });
88
+ mkdirSync(join(backupDir, 'prompts'), { recursive: true });
89
+ partiallyCreated = true;
90
+ const manifestEntries = [];
91
+ const copiedFiles = [];
92
+ for (const { rel, abs } of managedFiles) {
93
+ const dest = join(backupDir, rel);
94
+ copyFileSync(abs, dest);
95
+ const content = readFileSync(abs, 'utf8');
96
+ manifestEntries.push({ file: rel, sha256: sha256(content) });
97
+ copiedFiles.push(rel);
98
+ }
99
+ // Write manifest
100
+ const manifest = {
101
+ timestamp,
102
+ packageVersion,
103
+ githubDir,
104
+ files: manifestEntries,
105
+ };
106
+ writeFileSync(join(backupDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
107
+ // Prune old backups AFTER successful write
108
+ pruneOldBackups(backupsRoot, maxBackups);
109
+ return {
110
+ success: true,
111
+ backupDir,
112
+ timestamp,
113
+ fileCount: copiedFiles.length,
114
+ files: copiedFiles,
115
+ };
116
+ }
117
+ catch (error) {
118
+ // Clean up partial backup to avoid corrupted state
119
+ if (partiallyCreated) {
120
+ try {
121
+ rmSync(backupDir, { recursive: true, force: true });
122
+ }
123
+ catch {
124
+ // Best-effort cleanup — ignore secondary errors
125
+ }
126
+ }
127
+ return {
128
+ success: false,
129
+ backupDir,
130
+ timestamp,
131
+ fileCount: 0,
132
+ files: [],
133
+ error: error instanceof Error ? error : new Error(String(error)),
134
+ };
135
+ }
136
+ }
137
+ //# sourceMappingURL=backup-github-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-github-files.js","sourceRoot":"","sources":["../../src/utils/backup-github-files.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,9 @@
7
7
  */
8
8
  import type { ItemType, Methodology } from '../schemas/index.js';
9
9
  export { CACHE_CONFIG, type CacheStats, ContextCache, clearGlobalCache, getCache, } from './cache.js';
10
- export { type CopiedGithubFiles, copyDevstepsDocs, copyGithubFiles, writeSetupMd, } from './init-helpers.js';
10
+ export { type BackupOptions, type BackupResult, backupGithubFiles, } from './backup-github-files.js';
11
+ export { type CopiedGithubFiles, copyDevstepsDocs, copyGithubFiles, injectDevstepsComment, writeSetupMd, } from './init-helpers.js';
12
+ export { type UpdateCopilotFilesOptions, type UpdateCopilotFilesResult, updateCopilotFiles, } from './update-copilot-files.js';
11
13
  /**
12
14
  * Type to plural directory mapping
13
15
  * Uses items/ subdirectory for git-inspired object store (SPIKE-008)
@@ -84,4 +86,26 @@ export declare function isValidEmail(email: string): boolean;
84
86
  * Sanitizes a string for use in filenames
85
87
  */
86
88
  export declare function sanitizeFilename(name: string): string;
89
+ /**
90
+ * Normalizes escape sequences in description strings received from MCP tool calls.
91
+ *
92
+ * **Problem:** MCP clients (GitHub Copilot ≥ v1.0.0, Claude Code, etc.) transmit
93
+ * multiline strings with literal two-character sequences `\n`, `\t` instead of
94
+ * actual Unicode control characters. `JSON.parse` delivers these sequences unchanged,
95
+ * so `writeFileSync` writes them verbatim — producing unreadable `.md` files.
96
+ *
97
+ * **Heuristic:** If the incoming string already contains real newlines (U+000A),
98
+ * it is already properly formatted and returned unchanged. This makes the function
99
+ * safe to call on both MCP-origin strings and CLI-origin strings, and prevents
100
+ * double-conversion.
101
+ *
102
+ * **Handles:**
103
+ * - `\n` (backslash + n) → real newline (LF)
104
+ * - `\t` (backslash + t) → real tab
105
+ * - `\r` (backslash + r) → removed (stray CR from Windows-style `\r\n` literals)
106
+ *
107
+ * @param value - The raw description string from an MCP tool argument
108
+ * @returns A string with proper newline characters suitable for file I/O
109
+ */
110
+ export declare function normalizeMarkdown(value: string): string;
87
111
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,EACL,YAAY,EACZ,KAAK,UAAU,EACf,YAAY,EACZ,gBAAgB,EAChB,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAStD,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW;gBAGU,QAAQ,EAAE;;;;;;;;;;;gBAmBD,QAAQ,EAAE;;;;;;;;;;;gBA4B/E,QAAQ,EAAE;;;;;;;;;;;;EAyBpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAgBR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmBjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,EACL,YAAY,EACZ,KAAK,UAAU,EACf,YAAY,EACZ,gBAAgB,EAChB,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAStD,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW;gBAGU,QAAQ,EAAE;;;;;;;;;;;gBAmBD,QAAQ,EAAE;;;;;;;;;;;gBA4B/E,QAAQ,EAAE;;;;;;;;;;;;EAyBpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAgBR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmBjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASvD"}
@@ -7,8 +7,12 @@
7
7
  */
8
8
  // Export cache utilities
9
9
  export { CACHE_CONFIG, ContextCache, clearGlobalCache, getCache, } from './cache.js';
10
+ // Export backup utilities
11
+ export { backupGithubFiles, } from './backup-github-files.js';
10
12
  // Export init helpers
11
- export { copyDevstepsDocs, copyGithubFiles, writeSetupMd, } from './init-helpers.js';
13
+ export { copyDevstepsDocs, copyGithubFiles, injectDevstepsComment, writeSetupMd, } from './init-helpers.js';
14
+ // Export update helpers
15
+ export { updateCopilotFiles, } from './update-copilot-files.js';
12
16
  /**
13
17
  * Type to plural directory mapping
14
18
  * Uses items/ subdirectory for git-inspired object store (SPIKE-008)
@@ -187,4 +191,35 @@ export function sanitizeFilename(name) {
187
191
  .replace(/[^a-z0-9]+/g, '-')
188
192
  .replace(/^-|-$/g, '');
189
193
  }
194
+ /**
195
+ * Normalizes escape sequences in description strings received from MCP tool calls.
196
+ *
197
+ * **Problem:** MCP clients (GitHub Copilot ≥ v1.0.0, Claude Code, etc.) transmit
198
+ * multiline strings with literal two-character sequences `\n`, `\t` instead of
199
+ * actual Unicode control characters. `JSON.parse` delivers these sequences unchanged,
200
+ * so `writeFileSync` writes them verbatim — producing unreadable `.md` files.
201
+ *
202
+ * **Heuristic:** If the incoming string already contains real newlines (U+000A),
203
+ * it is already properly formatted and returned unchanged. This makes the function
204
+ * safe to call on both MCP-origin strings and CLI-origin strings, and prevents
205
+ * double-conversion.
206
+ *
207
+ * **Handles:**
208
+ * - `\n` (backslash + n) → real newline (LF)
209
+ * - `\t` (backslash + t) → real tab
210
+ * - `\r` (backslash + r) → removed (stray CR from Windows-style `\r\n` literals)
211
+ *
212
+ * @param value - The raw description string from an MCP tool argument
213
+ * @returns A string with proper newline characters suitable for file I/O
214
+ */
215
+ export function normalizeMarkdown(value) {
216
+ // Fast path: real newlines are present → already properly formatted
217
+ if (value.includes('\n'))
218
+ return value;
219
+ // Slow path: convert MCP-style escape sequences to real control characters
220
+ return value
221
+ .replace(/\\n/g, '\n')
222
+ .replace(/\\t/g, '\t')
223
+ .replace(/\\r/g, '');
224
+ }
190
225
  //# sourceMappingURL=index.js.map