@cleocode/adapters 2026.5.28 → 2026.5.33

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.
@@ -47,17 +47,12 @@ export declare class ClaudeCodeInstallProvider implements AdapterInstallProvider
47
47
  /**
48
48
  * Ensure CLAUDE.md contains @-references to CLEO instruction files.
49
49
  *
50
- * Creates CLAUDE.md if it does not exist. Appends any missing references.
50
+ * Delegates to CAAMP's canonical API which reads the instruction file name
51
+ * and default references from the provider registry (T1919).
51
52
  *
52
53
  * @param projectDir - Project root directory
53
54
  */
54
55
  ensureInstructionReferences(projectDir: string): Promise<void>;
55
- /**
56
- * Update CLAUDE.md with CLEO @-references.
57
- *
58
- * @returns true if the file was created or modified
59
- */
60
- private updateInstructionFile;
61
56
  /**
62
57
  * Install Claude Code-specific commands to .claude/commands/ in the project.
63
58
  *
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-code/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAwBjG;;;;;;;;;;;;;GAaG;AACH,qBAAa,yBAA0B,YAAW,sBAAsB;IACtE;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuC9D;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhC;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAkBrC;;;;;;OAMG;IACG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAkCtB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,oBAAoB;IAgC5B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;CAmD/B"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-code/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAajG;;;;;;;;;;;;;GAaG;AACH,qBAAa,yBAA0B,YAAW,sBAAsB;IACtE;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAwC9D;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhC;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAkBrC;;;;;;;OAOG;IACG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAkCtB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,oBAAoB;IAgC5B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;CAmD/B"}
@@ -53,7 +53,8 @@ export declare class CursorInstallProvider implements AdapterInstallProvider {
53
53
  /**
54
54
  * Ensure instruction files contain @-references to CLEO.
55
55
  *
56
- * Updates .cursorrules (legacy) and creates .cursor/rules/cleo.mdc (modern).
56
+ * Delegates the primary AGENTS.md write to CAAMP's canonical API (T1919) and
57
+ * also updates cursor-specific MDC + legacy .cursorrules formats.
57
58
  *
58
59
  * @param projectDir - Project root directory
59
60
  */
@@ -68,6 +69,9 @@ export declare class CursorInstallProvider implements AdapterInstallProvider {
68
69
  private updateInstructionFiles;
69
70
  /**
70
71
  * Update legacy .cursorrules file with @-references.
72
+ *
73
+ * References are sourced from the CAAMP provider registry (T1919) rather than
74
+ * a local constant, keeping this adapter in sync with the single source of truth.
71
75
  * Only modifies the file if it already exists (does not create it).
72
76
  *
73
77
  * @returns true if the file was modified
@@ -78,6 +82,7 @@ export declare class CursorInstallProvider implements AdapterInstallProvider {
78
82
  *
79
83
  * MDC (Markdown Component) format is Cursor's modern rule file format.
80
84
  * Each .mdc file in .cursor/rules/ is loaded as a rule set.
85
+ * References are sourced from the CAAMP provider registry (T1919).
81
86
  *
82
87
  * @returns true if the file was created or modified
83
88
  */
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/providers/cursor/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiBjG;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA2B9D;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhC;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAqBrC;;;;;;OAMG;IACG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,sBAAsB;CAyC/B"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/providers/cursor/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOjG;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA+B9D;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhC;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBrC;;;;;;;OAOG;IACG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAuBzB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,sBAAsB;CAyC/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/adapters",
3
- "version": "2026.5.28",
3
+ "version": "2026.5.33",
4
4
  "description": "Unified provider adapters for CLEO (Claude Code, OpenCode, Cursor)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -15,9 +15,9 @@
15
15
  "@ai-sdk/anthropic": "^3.0.69",
16
16
  "@ai-sdk/openai": "^2.0.53",
17
17
  "ai": "^6.0.168",
18
- "@cleocode/caamp": "2026.5.28",
19
- "@cleocode/contracts": "2026.5.28",
20
- "@cleocode/paths": "2026.5.28"
18
+ "@cleocode/caamp": "2026.5.33",
19
+ "@cleocode/contracts": "2026.5.33",
20
+ "@cleocode/paths": "2026.5.33"
21
21
  },
22
22
  "license": "MIT",
23
23
  "engines": {
@@ -30,7 +30,7 @@
30
30
  "devDependencies": {
31
31
  "@types/node": "^22.19.15",
32
32
  "vitest": "^4.1.4",
33
- "@cleocode/playbooks": "2026.5.28"
33
+ "@cleocode/playbooks": "2026.5.33"
34
34
  },
35
35
  "repository": {
36
36
  "type": "git",
@@ -186,18 +186,18 @@ describe('ClaudeCodeInstallProvider — integration', () => {
186
186
  expect(content).toContain('@.cleo/memory-bridge.md');
187
187
  });
188
188
 
189
- it('does not duplicate existing references', async () => {
190
- // Pre-seed with the dynamically-resolved reference so dedup logic fires
191
- const { getCleoTemplatesTildePath } = await import('../providers/shared/paths.js');
192
- const injectionRef = `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`;
193
- const existing = `${injectionRef}\n@.cleo/memory-bridge.md\n`;
194
- writeFileSync(join(testDir, 'CLAUDE.md'), existing, 'utf-8');
189
+ it('is idempotent — calling twice does not duplicate the CAAMP block', async () => {
190
+ // First call creates the CAAMP-managed block
191
+ await install.ensureInstructionReferences(testDir);
192
+ const firstContent = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
193
+ const firstCount = (firstContent.match(/@~\/.+\/CLEO-INJECTION\.md/g) ?? []).length;
194
+ expect(firstCount).toBe(1);
195
195
 
196
+ // Second call must be idempotent — CAAMP detects existing block and returns 'intact'
196
197
  await install.ensureInstructionReferences(testDir);
197
- const content = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
198
- // Should not have duplicated lines
199
- const injectionCount = (content.match(/@~\/.+\/CLEO-INJECTION\.md/g) ?? []).length;
200
- expect(injectionCount).toBe(1);
198
+ const secondContent = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
199
+ const secondCount = (secondContent.match(/@~\/.+\/CLEO-INJECTION\.md/g) ?? []).length;
200
+ expect(secondCount).toBe(1);
201
201
  });
202
202
 
203
203
  it('install returns expected shape', async () => {
@@ -49,10 +49,21 @@ vi.mock('node:fs', async (importOriginal) => {
49
49
  });
50
50
 
51
51
  vi.mock('node:fs/promises', () => ({
52
+ mkdir: vi.fn().mockResolvedValue(undefined),
53
+ readFile: vi.fn().mockResolvedValue(''),
52
54
  writeFile: vi.fn().mockResolvedValue(undefined),
53
55
  unlink: vi.fn().mockResolvedValue(undefined),
54
56
  }));
55
57
 
58
+ vi.mock('@cleocode/caamp', () => ({
59
+ ensureProviderInstructionFile: vi.fn().mockResolvedValue({
60
+ filePath: '/tmp/test-project/CLAUDE.md',
61
+ instructFile: 'CLAUDE.md',
62
+ action: 'added',
63
+ providerId: 'claude-code',
64
+ }),
65
+ }));
66
+
56
67
  describe('ClaudeCodeAdapter', () => {
57
68
  let adapter: ClaudeCodeAdapter;
58
69
 
@@ -21,22 +21,12 @@ import {
21
21
  import { homedir } from 'node:os';
22
22
  import { dirname, join } from 'node:path';
23
23
  import { fileURLToPath } from 'node:url';
24
+ import { ensureProviderInstructionFile } from '@cleocode/caamp';
24
25
  import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cleocode/contracts';
25
26
  import {
26
27
  type InstallHookTemplatesResult,
27
28
  installProviderHookTemplates,
28
29
  } from '../shared/hook-template-installer.js';
29
- import { getCleoTemplatesTildePath } from '../shared/paths.js';
30
-
31
- /**
32
- * Lines that should appear in CLAUDE.md to reference CLEO.
33
- * The CLEO-INJECTION.md path is resolved dynamically to support non-default
34
- * XDG / OS installation locations (T916).
35
- */
36
- const INSTRUCTION_REFERENCES = [
37
- `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
38
- '@.cleo/memory-bridge.md',
39
- ];
40
30
 
41
31
  /** Resolve the commands directory bundled with this adapter. */
42
32
  function getAdapterCommandsDir(): string {
@@ -72,10 +62,11 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
72
62
  let instructionFileUpdated = false;
73
63
  const details: Record<string, unknown> = {};
74
64
 
75
- // Step 1: Ensure CLAUDE.md has @-references
76
- instructionFileUpdated = this.updateInstructionFile(projectDir);
65
+ // Step 1: Ensure CLAUDE.md has @-references via CAAMP canonical API (T1919)
66
+ const instructionResult = await ensureProviderInstructionFile('claude-code', projectDir, {});
67
+ instructionFileUpdated = instructionResult.action !== 'intact';
77
68
  if (instructionFileUpdated) {
78
- details.instructionFile = join(projectDir, 'CLAUDE.md');
69
+ details.instructionFile = instructionResult.filePath;
79
70
  }
80
71
 
81
72
  // Step 2: Install adapter-provided commands to .claude/commands/
@@ -138,48 +129,13 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
138
129
  /**
139
130
  * Ensure CLAUDE.md contains @-references to CLEO instruction files.
140
131
  *
141
- * Creates CLAUDE.md if it does not exist. Appends any missing references.
132
+ * Delegates to CAAMP's canonical API which reads the instruction file name
133
+ * and default references from the provider registry (T1919).
142
134
  *
143
135
  * @param projectDir - Project root directory
144
136
  */
145
137
  async ensureInstructionReferences(projectDir: string): Promise<void> {
146
- this.updateInstructionFile(projectDir);
147
- }
148
-
149
- /**
150
- * Update CLAUDE.md with CLEO @-references.
151
- *
152
- * @returns true if the file was created or modified
153
- */
154
- private updateInstructionFile(projectDir: string): boolean {
155
- const claudeMdPath = join(projectDir, 'CLAUDE.md');
156
- let content = '';
157
- let existed = false;
158
-
159
- if (existsSync(claudeMdPath)) {
160
- content = readFileSync(claudeMdPath, 'utf-8');
161
- existed = true;
162
- }
163
-
164
- const missingRefs = INSTRUCTION_REFERENCES.filter((ref) => !content.includes(ref));
165
-
166
- if (missingRefs.length === 0) {
167
- return false;
168
- }
169
-
170
- const refsBlock = missingRefs.join('\n');
171
-
172
- if (existed) {
173
- // Append missing references
174
- const separator = content.endsWith('\n') ? '' : '\n';
175
- content = content + separator + refsBlock + '\n';
176
- } else {
177
- // Create new CLAUDE.md with references
178
- content = refsBlock + '\n';
179
- }
180
-
181
- writeFileSync(claudeMdPath, content, 'utf-8');
182
- return true;
138
+ await ensureProviderInstructionFile('claude-code', projectDir, {});
183
139
  }
184
140
 
185
141
  /**
@@ -17,6 +17,7 @@ vi.mock('node:fs', async (importOriginal) => {
17
17
  existsSync: vi.fn((path: string) => {
18
18
  if (typeof path === 'string' && path.includes('.cursor')) return true;
19
19
  if (typeof path === 'string' && path.includes('.cursorrules')) return false;
20
+ if (typeof path === 'string' && path.includes('AGENTS.md')) return false;
20
21
  return false;
21
22
  }),
22
23
  readFileSync: vi.fn((path: string) => {
@@ -30,6 +31,22 @@ vi.mock('node:fs', async (importOriginal) => {
30
31
  };
31
32
  });
32
33
 
34
+ vi.mock('node:fs/promises', () => ({
35
+ mkdir: vi.fn().mockResolvedValue(undefined),
36
+ readFile: vi.fn().mockResolvedValue(''),
37
+ writeFile: vi.fn().mockResolvedValue(undefined),
38
+ unlink: vi.fn().mockResolvedValue(undefined),
39
+ }));
40
+
41
+ vi.mock('@cleocode/caamp', () => ({
42
+ ensureProviderInstructionFile: vi.fn().mockResolvedValue({
43
+ filePath: '/tmp/test-project/AGENTS.md',
44
+ instructFile: 'AGENTS.md',
45
+ action: 'added',
46
+ providerId: 'cursor',
47
+ }),
48
+ }));
49
+
33
50
  describe('CursorAdapter', () => {
34
51
  let adapter: CursorAdapter;
35
52
 
@@ -18,6 +18,7 @@
18
18
 
19
19
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
20
20
  import { join } from 'node:path';
21
+ import { ensureProviderInstructionFile } from '@cleocode/caamp';
21
22
  import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cleocode/contracts';
22
23
  import {
23
24
  type InstallHookTemplatesResult,
@@ -25,16 +26,6 @@ import {
25
26
  } from '../shared/hook-template-installer.js';
26
27
  import { getCleoTemplatesTildePath } from '../shared/paths.js';
27
28
 
28
- /**
29
- * Lines that should appear in instruction files to reference CLEO.
30
- * The CLEO-INJECTION.md path is resolved dynamically to support non-default
31
- * XDG / OS installation locations (T916).
32
- */
33
- const INSTRUCTION_REFERENCES = [
34
- `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
35
- '@.cleo/memory-bridge.md',
36
- ];
37
-
38
29
  /**
39
30
  * Install provider for Cursor.
40
31
  *
@@ -62,8 +53,12 @@ export class CursorInstallProvider implements AdapterInstallProvider {
62
53
  let instructionFileUpdated = false;
63
54
  const details: Record<string, unknown> = {};
64
55
 
65
- // Step 1: Ensure instruction files have @-references
66
- instructionFileUpdated = this.updateInstructionFiles(projectDir);
56
+ // Step 1: Ensure instruction files have @-references via CAAMP canonical API (T1919).
57
+ // ensureProviderInstructionFile handles the primary AGENTS.md (registry instructFile);
58
+ // updateInstructionFiles also manages cursor-specific MDC + legacy .cursorrules formats.
59
+ const instructionResult = await ensureProviderInstructionFile('cursor', projectDir, {});
60
+ const cursorFilesUpdated = this.updateInstructionFiles(projectDir);
61
+ instructionFileUpdated = instructionResult.action !== 'intact' || cursorFilesUpdated;
67
62
  if (instructionFileUpdated) {
68
63
  details.instructionFiles = this.getUpdatedFileList(projectDir);
69
64
  }
@@ -105,7 +100,8 @@ export class CursorInstallProvider implements AdapterInstallProvider {
105
100
  if (existsSync(rulesPath)) {
106
101
  try {
107
102
  const content = readFileSync(rulesPath, 'utf-8');
108
- if (INSTRUCTION_REFERENCES.some((ref) => content.includes(ref))) {
103
+ const injectionRef = `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`;
104
+ if (content.includes(injectionRef) || content.includes('@.cleo/memory-bridge.md')) {
109
105
  return true;
110
106
  }
111
107
  } catch {
@@ -119,11 +115,13 @@ export class CursorInstallProvider implements AdapterInstallProvider {
119
115
  /**
120
116
  * Ensure instruction files contain @-references to CLEO.
121
117
  *
122
- * Updates .cursorrules (legacy) and creates .cursor/rules/cleo.mdc (modern).
118
+ * Delegates the primary AGENTS.md write to CAAMP's canonical API (T1919) and
119
+ * also updates cursor-specific MDC + legacy .cursorrules formats.
123
120
  *
124
121
  * @param projectDir - Project root directory
125
122
  */
126
123
  async ensureInstructionReferences(projectDir: string): Promise<void> {
124
+ await ensureProviderInstructionFile('cursor', projectDir, {});
127
125
  this.updateInstructionFiles(projectDir);
128
126
  }
129
127
 
@@ -152,6 +150,9 @@ export class CursorInstallProvider implements AdapterInstallProvider {
152
150
 
153
151
  /**
154
152
  * Update legacy .cursorrules file with @-references.
153
+ *
154
+ * References are sourced from the CAAMP provider registry (T1919) rather than
155
+ * a local constant, keeping this adapter in sync with the single source of truth.
155
156
  * Only modifies the file if it already exists (does not create it).
156
157
  *
157
158
  * @returns true if the file was modified
@@ -163,7 +164,11 @@ export class CursorInstallProvider implements AdapterInstallProvider {
163
164
  }
164
165
 
165
166
  let content = readFileSync(rulesPath, 'utf-8');
166
- const missingRefs = INSTRUCTION_REFERENCES.filter((ref) => !content.includes(ref));
167
+ const cursorRefs = [
168
+ `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
169
+ '@.cleo/memory-bridge.md',
170
+ ];
171
+ const missingRefs = cursorRefs.filter((ref) => !content.includes(ref));
167
172
 
168
173
  if (missingRefs.length === 0) {
169
174
  return false;
@@ -180,6 +185,7 @@ export class CursorInstallProvider implements AdapterInstallProvider {
180
185
  *
181
186
  * MDC (Markdown Component) format is Cursor's modern rule file format.
182
187
  * Each .mdc file in .cursor/rules/ is loaded as a rule set.
188
+ * References are sourced from the CAAMP provider registry (T1919).
183
189
  *
184
190
  * @returns true if the file was created or modified
185
191
  */
@@ -187,6 +193,10 @@ export class CursorInstallProvider implements AdapterInstallProvider {
187
193
  const rulesDir = join(projectDir, '.cursor', 'rules');
188
194
  const mdcPath = join(rulesDir, 'cleo.mdc');
189
195
 
196
+ const cursorRefs = [
197
+ `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
198
+ '@.cleo/memory-bridge.md',
199
+ ];
190
200
  const expectedContent = [
191
201
  '---',
192
202
  'description: CLEO task management protocol references',
@@ -194,7 +204,7 @@ export class CursorInstallProvider implements AdapterInstallProvider {
194
204
  'alwaysApply: true',
195
205
  '---',
196
206
  '',
197
- ...INSTRUCTION_REFERENCES,
207
+ ...cursorRefs,
198
208
  '',
199
209
  ].join('\n');
200
210