create-harness-vibe-coding 0.8.13 → 0.8.16

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 (115) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/README-CN.md +41 -9
  3. package/README.md +39 -9
  4. package/package.json +2 -1
  5. package/src/generator.js +601 -472
  6. package/src/index.js +4 -4
  7. package/templates/common/.claude/agents/architect-manager.md +1 -0
  8. package/templates/common/.claude/agents/architect.md +2 -1
  9. package/templates/common/.claude/agents/codebase-explorer.md +1 -0
  10. package/templates/common/.claude/agents/context-master.md +2 -1
  11. package/templates/common/.claude/agents/debugger.md +1 -0
  12. package/templates/common/.claude/agents/docs-researcher.md +2 -1
  13. package/templates/common/.claude/agents/explore-manager.md +1 -0
  14. package/templates/common/.claude/agents/implement-manager.md +1 -0
  15. package/templates/common/.claude/agents/implementer.md +1 -0
  16. package/templates/common/.claude/agents/memory-master.md +2 -1
  17. package/templates/common/.claude/agents/planner.md +3 -2
  18. package/templates/common/.claude/agents/reflector.md +1 -0
  19. package/templates/common/.claude/agents/researcher.md +1 -0
  20. package/templates/common/.claude/agents/review-manager.md +1 -0
  21. package/templates/common/.claude/agents/reviewer.md +2 -1
  22. package/templates/common/.claude/agents/task-scribe.md +1 -0
  23. package/templates/common/.claude/agents/tdd-guide.md +5 -4
  24. package/templates/common/.claude/agents/test-writer.md +6 -5
  25. package/templates/common/.claude/agents/verifier.md +1 -0
  26. package/templates/common/.claude/commands/wf-help.md +1 -0
  27. package/templates/common/.claude/commands/wf-update.md +68 -10
  28. package/templates/common/.claude/rules/ecc/common.md +6 -5
  29. package/templates/common/.claude/skills/subagent-orchestrator/SKILL.md +12 -6
  30. package/templates/common/.claude/skills/tdd/SKILL.md +5 -5
  31. package/templates/common/.claude/skills/wf/SKILL.md +13 -5
  32. package/templates/common/.claude/skills/wf-agents-docs/SKILL.md +119 -0
  33. package/templates/common/.claude/skills/wf-auto/SKILL.md +27 -7
  34. package/templates/common/.claude/skills/wf-auto-spark/SKILL.md +12 -5
  35. package/templates/common/.claude/skills/wf-learn/SKILL.md +6 -0
  36. package/templates/common/.claude/skills/wf-max/SKILL.md +22 -7
  37. package/templates/common/.claude/skills/wf-readme/SKILL.md +8 -2
  38. package/templates/common/.claude/skills/wf-remove/SKILL.md +6 -0
  39. package/templates/common/.claude/skills/wf-review/SKILL.md +10 -3
  40. package/templates/common/.claude/skills/wf-update/SKILL.md +41 -4
  41. package/templates/common/.harness-version +290 -128
  42. package/templates/common/.opencode/agents/architect-manager.md +1 -0
  43. package/templates/common/.opencode/agents/architect.md +2 -1
  44. package/templates/common/.opencode/agents/codebase-explorer.md +1 -0
  45. package/templates/common/.opencode/agents/context-master.md +2 -1
  46. package/templates/common/.opencode/agents/debugger.md +1 -0
  47. package/templates/common/.opencode/agents/docs-researcher.md +2 -1
  48. package/templates/common/.opencode/agents/explore-manager.md +1 -0
  49. package/templates/common/.opencode/agents/implement-manager.md +1 -0
  50. package/templates/common/.opencode/agents/implementer.md +1 -0
  51. package/templates/common/.opencode/agents/memory-master.md +2 -1
  52. package/templates/common/.opencode/agents/planner.md +3 -2
  53. package/templates/common/.opencode/agents/reflector.md +1 -0
  54. package/templates/common/.opencode/agents/researcher.md +1 -0
  55. package/templates/common/.opencode/agents/review-manager.md +1 -0
  56. package/templates/common/.opencode/agents/reviewer.md +2 -1
  57. package/templates/common/.opencode/agents/task-scribe.md +1 -0
  58. package/templates/common/.opencode/agents/tdd-guide.md +5 -4
  59. package/templates/common/.opencode/agents/test-writer.md +6 -5
  60. package/templates/common/.opencode/agents/verifier.md +1 -0
  61. package/templates/common/.opencode/commands/wf-auto-spark.md +3 -2
  62. package/templates/common/.opencode/commands/wf-auto.md +3 -2
  63. package/templates/common/.opencode/commands/wf-help.md +1 -0
  64. package/templates/common/.opencode/commands/wf-learn.md +3 -2
  65. package/templates/common/.opencode/commands/wf-max.md +3 -2
  66. package/templates/common/.opencode/commands/wf-readme.md +3 -2
  67. package/templates/common/.opencode/commands/wf-remove.md +3 -2
  68. package/templates/common/.opencode/commands/wf-review.md +3 -2
  69. package/templates/common/.opencode/commands/wf-update.md +68 -10
  70. package/templates/common/.opencode/commands/wf.md +3 -2
  71. package/templates/common/CLAUDE.md +14 -12
  72. package/templates/common/Harness/MEMORY.md +21 -18
  73. package/templates/common/Harness/README.md +41 -39
  74. package/templates/common/Harness/ownership.manifest.json +815 -0
  75. package/templates/common/Harness/{architecture.md → project/architecture.md} +1 -1
  76. package/templates/common/Harness/research/README.md +3 -3
  77. package/templates/common/Harness/scripts/context-budget.mjs +95 -0
  78. package/templates/common/Harness/scripts/l2-cache-telemetry.mjs +703 -0
  79. package/templates/common/Harness/scripts/scan-clean.mjs +13 -3
  80. package/templates/common/Harness/scripts/validate-harness.mjs +332 -175
  81. package/templates/common/Harness/scripts/wf-remove.mjs +60 -34
  82. package/templates/common/Harness/scripts/wf-update-check.mjs +355 -45
  83. package/templates/common/Harness/settings.json +43 -0
  84. package/templates/common/Harness/{ECC-GUIDE.md → specs/guides/ECC-GUIDE.md} +4 -4
  85. package/templates/common/Harness/{SETUP.md → specs/guides/SETUP.md} +32 -35
  86. package/templates/common/Harness/{extension.md → specs/guides/extension.md} +3 -3
  87. package/templates/common/Harness/{lifecycle.md → specs/guides/lifecycle.md} +2 -2
  88. package/templates/common/Harness/{agent-workflow.md → specs/runtime/agent-workflow.md} +6 -6
  89. package/templates/common/Harness/{context-loading.md → specs/runtime/context-loading.md} +85 -21
  90. package/templates/common/Harness/{dispatch.md → specs/runtime/dispatch.md} +3 -2
  91. package/templates/common/Harness/{subagents.md → specs/runtime/subagents.md} +10 -5
  92. package/templates/common/Harness/{WF-AUTO-SPARK.md → specs/workflows/WF-AUTO-SPARK.md} +2 -2
  93. package/templates/common/Harness/{WF-AUTO.md → specs/workflows/WF-AUTO.md} +6 -1
  94. package/templates/common/Harness/{WF-KERNEL.md → specs/workflows/WF-KERNEL.md} +10 -0
  95. package/templates/common/Harness/{WF-MAX.md → specs/workflows/WF-MAX.md} +10 -5
  96. package/templates/common/Harness/{WF-STATE.md → specs/workflows/WF-STATE.md} +5 -0
  97. package/templates/common/Harness/{WF.md → specs/workflows/WF.md} +12 -1
  98. package/templates/common/README.md +8 -6
  99. package/templates/common/memory/startup-hints.md +19 -17
  100. package/templates/optional/skills/browser-e2e/.claude/skills/browser-e2e/SKILL.md +1 -1
  101. package/templates/optional/skills/browser-e2e/.claude/skills/wf-browser/SKILL.md +7 -0
  102. package/templates/optional/skills/browser-e2e/.opencode/commands/wf-browser.md +3 -2
  103. package/templates/optional/skills/browser-e2e/Harness/workflows/browser-e2e.md +4 -4
  104. package/templates/optional/skills/github-pr-review/.claude/skills/github-pr-review/SKILL.md +1 -1
  105. package/templates/optional/skills/python-backend/.claude/skills/python-backend/SKILL.md +1 -1
  106. package/templates/optional/skills/ts-react-frontend/.claude/skills/ts-react-frontend/SKILL.md +1 -1
  107. package/templates/optional/skills/ui-ux-review/.claude/skills/ui-ux-review/SKILL.md +1 -1
  108. /package/templates/common/Harness/{ACCEPTANCE_PROTOCOL.md → specs/protocols/ACCEPTANCE_PROTOCOL.md} +0 -0
  109. /package/templates/common/Harness/{AGENT_ISOLATION.md → specs/protocols/AGENT_ISOLATION.md} +0 -0
  110. /package/templates/common/Harness/{DEBUG_PROTOCOL.md → specs/protocols/DEBUG_PROTOCOL.md} +0 -0
  111. /package/templates/common/Harness/{HARNESS_BRIDGE.md → specs/protocols/HARNESS_BRIDGE.md} +0 -0
  112. /package/templates/common/Harness/{MEMORY_PROTOCOL.md → specs/protocols/MEMORY_PROTOCOL.md} +0 -0
  113. /package/templates/common/Harness/{TASK_ARCHIVE.md → specs/protocols/TASK_ARCHIVE.md} +0 -0
  114. /package/templates/common/Harness/{TDD-GUIDE.md → specs/protocols/TDD-GUIDE.md} +0 -0
  115. /package/templates/common/Harness/{WF-AUTO-ANGLES.md → specs/workflows/WF-AUTO-ANGLES.md} +0 -0
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * wf-remove.mjs �?Safely remove Harness framework files.
3
+ * wf-remove.mjs - Safely remove Harness framework files.
4
4
  *
5
5
  * Classifies all Harness-owned files into:
6
- * SAFE �?framework files matching stored checksums �?auto-remove
7
- * MODIFIED �?framework files edited by user �?MUST confirm
8
- * USER �?user data files �?NEVER remove
6
+ * SAFE - framework files matching stored checksums, auto-remove
7
+ * MODIFIED - framework files edited by user, MUST confirm
8
+ * USER - user data files, NEVER remove
9
9
  *
10
10
  * Usage:
11
11
  * node Harness/scripts/wf-remove.mjs # dry-run: show plan
@@ -47,7 +47,7 @@ const HARNESS_PREFIXES = [
47
47
  'tests/.gitkeep',
48
48
  ];
49
49
 
50
- /** Files the user owns �?NEVER remove. Consistent with wf-update-check PRESERVE_PATTERNS. */
50
+ /** Files the user owns - NEVER remove. Consistent with wf-update-check PRESERVE_PATTERNS. */
51
51
  const USER_DATA_PATTERNS = [
52
52
  /^Harness\/PROGRESS\.md$/,
53
53
  /^Harness\/tasks\//,
@@ -55,6 +55,7 @@ const USER_DATA_PATTERNS = [
55
55
  /^Harness\/research\/PRD\.md$/,
56
56
  /^Harness\/research\/research-results\.md$/,
57
57
  /^Harness\/architecture\.md$/,
58
+ /^Harness\/project\/architecture\.md$/,
58
59
  /^Harness\/workflows\//,
59
60
  /^Harness\/features\//,
60
61
  /^Harness\/domain\//,
@@ -72,6 +73,7 @@ const PURGEABLE_HARNESS_DATA_PATTERNS = [
72
73
  /^Harness\/research\/PRD\.md$/,
73
74
  /^Harness\/research\/research-results\.md$/,
74
75
  /^Harness\/architecture\.md$/,
76
+ /^Harness\/project\/architecture\.md$/,
75
77
  /^Harness\/workflows\//,
76
78
  /^Harness\/features\//,
77
79
  /^Harness\/domain\//,
@@ -108,6 +110,7 @@ const KEEP_FRAMEWORK = new Set([
108
110
  const BUILT_IN_AGENT_NAMES = [
109
111
  'architect-manager',
110
112
  'architect',
113
+ 'codebase-explorer',
111
114
  'context-master',
112
115
  'debugger',
113
116
  'docs-researcher',
@@ -120,6 +123,7 @@ const BUILT_IN_AGENT_NAMES = [
120
123
  'researcher',
121
124
  'review-manager',
122
125
  'reviewer',
126
+ 'task-scribe',
123
127
  'tdd-guide',
124
128
  'test-writer',
125
129
  'verifier',
@@ -134,6 +138,7 @@ const BUILT_IN_SKILL_NAMES = [
134
138
  'ts-react-frontend',
135
139
  'ui-ux-review',
136
140
  'wf',
141
+ 'wf-agents-docs',
137
142
  'wf-auto',
138
143
  'wf-auto-spark',
139
144
  'wf-browser',
@@ -167,10 +172,17 @@ function isKnownFrameworkFile(file) {
167
172
  /** Directories to clean up if empty after file removal. */
168
173
  const CLEANUP_DIRS = [
169
174
  '.claude/agents',
175
+ '.claude/skills/browser-e2e',
176
+ '.claude/skills/github-pr-review',
177
+ '.claude/skills/python-backend',
170
178
  '.claude/skills/wf-auto',
179
+ '.claude/skills/wf-auto-spark',
171
180
  '.claude/skills/wf-browser',
172
181
  '.claude/skills/tdd',
182
+ '.claude/skills/ts-react-frontend',
183
+ '.claude/skills/ui-ux-review',
173
184
  '.claude/skills/wf',
185
+ '.claude/skills/wf-agents-docs',
174
186
  '.claude/skills/wf-learn',
175
187
  '.claude/skills/wf-max',
176
188
  '.claude/skills/wf-readme',
@@ -178,10 +190,18 @@ const CLEANUP_DIRS = [
178
190
  '.claude/skills/wf-update',
179
191
  '.claude/skills/wf-remove',
180
192
  '.claude/skills/subagent-orchestrator',
193
+ '.claude/skills',
194
+ '.agents/skills/browser-e2e',
195
+ '.agents/skills/github-pr-review',
196
+ '.agents/skills/python-backend',
181
197
  '.agents/skills/wf-auto',
198
+ '.agents/skills/wf-auto-spark',
182
199
  '.agents/skills/wf-browser',
183
200
  '.agents/skills/tdd',
201
+ '.agents/skills/ts-react-frontend',
202
+ '.agents/skills/ui-ux-review',
184
203
  '.agents/skills/wf',
204
+ '.agents/skills/wf-agents-docs',
185
205
  '.agents/skills/wf-learn',
186
206
  '.agents/skills/wf-max',
187
207
  '.agents/skills/wf-readme',
@@ -199,6 +219,12 @@ const CLEANUP_DIRS = [
199
219
  '.claude/rules/ecc',
200
220
  '.claude/rules',
201
221
  'Harness/scripts',
222
+ 'Harness/specs/guides',
223
+ 'Harness/specs/protocols',
224
+ 'Harness/specs/runtime',
225
+ 'Harness/specs/workflows',
226
+ 'Harness/specs',
227
+ 'Harness/project',
202
228
  'Harness/research',
203
229
  'Harness/workflows',
204
230
  'Harness/domain',
@@ -317,7 +343,7 @@ function removeEmptyDirs(startDir) {
317
343
 
318
344
  async function askUser(question) {
319
345
  if (!process.stdin.isTTY) {
320
- console.log(' (non-interactive �?defaulting to KEEP)');
346
+ console.log(' (non-interactive - defaulting to KEEP)');
321
347
  return 'k';
322
348
  }
323
349
  const rl = createInterface({ input: process.stdin, output: process.stdout });
@@ -351,7 +377,7 @@ async function main() {
351
377
  // from disk. This keeps JSON plans honest about what will remain.
352
378
  for (const file of [
353
379
  'Harness/PROGRESS.md',
354
- 'Harness/architecture.md',
380
+ 'Harness/project/architecture.md',
355
381
  ]) {
356
382
  addExistingFile(allFiles, file, scanIssues);
357
383
  }
@@ -375,7 +401,7 @@ async function main() {
375
401
  '.agents/skills/tdd/SKILL.md',
376
402
  '.claude/skills/wf-auto/SKILL.md',
377
403
  '.agents/skills/wf-auto/SKILL.md',
378
- 'Harness/WF-AUTO.md',
404
+ 'Harness/specs/workflows/WF-AUTO.md',
379
405
  'Harness/tasks/auto/PROGRESS.md',
380
406
  'Harness/tasks/auto/PLAN.md',
381
407
  'Harness/tasks/_template/ARTIFACTS.md',
@@ -390,9 +416,9 @@ async function main() {
390
416
  }
391
417
 
392
418
  // 2. Classify every file
393
- const safe = []; // SAFE �?matches checksum, auto-remove
394
- const modified = []; // MODIFIED �?user edited, must confirm
395
- const user = []; // USER �?never remove
419
+ const safe = []; // SAFE - matches checksum, auto-remove
420
+ const modified = []; // MODIFIED - user edited, must confirm
421
+ const user = []; // USER - never remove
396
422
  const skipped = []; // File not on disk, traversal rejected, or framework-keep
397
423
  const purge = []; // Explicitly requested Harness user-data removal
398
424
  skipped.push(...scanIssues);
@@ -414,13 +440,13 @@ async function main() {
414
440
  });
415
441
  continue;
416
442
  }
417
- user.push({ file, reason: 'user data �?NEVER removed' });
443
+ user.push({ file, reason: 'user data - NEVER removed' });
418
444
  continue;
419
445
  }
420
446
 
421
447
  // Only allow deletion of files under harness-owned prefixes
422
448
  if (!isHarnessOwned(canonical)) {
423
- user.push({ file, reason: 'outside harness prefix �?NEVER removed' });
449
+ user.push({ file, reason: 'outside harness prefix - NEVER removed' });
424
450
  continue;
425
451
  }
426
452
 
@@ -467,7 +493,7 @@ async function main() {
467
493
  const settingsHash = sha256File(settingsFile);
468
494
  const storedSettingsHash = storedChecksums['.claude/settings.json'];
469
495
  if (storedSettingsHash && settingsHash !== storedSettingsHash) {
470
- // User modified settings �?move to modified
496
+ // User modified settings - move to modified
471
497
  // Remove from safe if it was there
472
498
  const idx = safe.findIndex(s => s.file === '.claude/settings.json');
473
499
  if (idx >= 0) {
@@ -511,16 +537,16 @@ async function main() {
511
537
  return;
512
538
  }
513
539
 
514
- console.log('\n🧹 WF-REMOVE �?Harness framework removal plan\n');
540
+ console.log('\nWF-REMOVE - Harness framework removal plan\n');
515
541
 
516
542
  if (safe.length > 0) {
517
- console.log(`�?SAFE (${safe.length} files �?auto-remove, unmodified framework):`);
518
- for (const s of safe) console.log(` �?${s.file}`);
543
+ console.log(`SAFE (${safe.length} files - auto-remove, unmodified framework):`);
544
+ for (const s of safe) console.log(` - ${s.file}`);
519
545
  console.log('');
520
546
  }
521
547
 
522
548
  if (modified.length > 0) {
523
- console.log(`�?MODIFIED (${modified.length} files �?REQUIRE CONFIRMATION):`);
549
+ console.log(`MODIFIED (${modified.length} files - REQUIRE CONFIRMATION):`);
524
550
  for (const m of modified) {
525
551
  console.log(` ? ${m.file} [${m.reason}]`);
526
552
  }
@@ -528,8 +554,8 @@ async function main() {
528
554
  }
529
555
 
530
556
  if (user.length > 0) {
531
- console.log(`🔒 USER DATA (${user.length} files �?NEVER removed):`);
532
- for (const u of user) console.log(` �?${u.file} [${u.reason}]`);
557
+ console.log(`USER DATA (${user.length} files - NEVER removed):`);
558
+ for (const u of user) console.log(` - ${u.file} [${u.reason}]`);
533
559
  console.log('');
534
560
  }
535
561
 
@@ -546,17 +572,17 @@ async function main() {
546
572
  return;
547
573
  }
548
574
 
549
- // 4. Apply �?remove SAFE files automatically (rehash before unlink)
575
+ // 4. Apply - remove SAFE files automatically (rehash before unlink)
550
576
  let safeRemoved = 0;
551
577
  let safeFailed = 0;
552
578
  for (const s of safe) {
553
579
  const diskPath = safePath(s.file);
554
- if (!diskPath) { console.error(` �?Traversal rejected: ${s.file}`); safeFailed++; continue; }
580
+ if (!diskPath) { console.error(` ! Traversal rejected: ${s.file}`); safeFailed++; continue; }
555
581
  if (!existsSync(diskPath)) continue;
556
582
  // Re-verify hash hasn't changed since classification
557
583
  const currentHash = sha256File(diskPath);
558
584
  if (currentHash !== s.storedHash) {
559
- console.log(` �?Skipped (modified since classification): ${s.file}`);
585
+ console.log(` ! Skipped (modified since classification): ${s.file}`);
560
586
  safeFailed++;
561
587
  continue;
562
588
  }
@@ -564,13 +590,13 @@ async function main() {
564
590
  unlinkSync(diskPath);
565
591
  safeRemoved++;
566
592
  } catch (e) {
567
- console.error(` �?Failed to remove: ${s.file} �?${e.message}`);
593
+ console.error(` ! Failed to remove: ${s.file} - ${e.message}`);
568
594
  safeFailed++;
569
595
  }
570
596
  }
571
- console.log(`�?Removed ${safeRemoved} safe files.`);
597
+ console.log(`Removed ${safeRemoved} safe files.`);
572
598
 
573
- // 5. Handle MODIFIED files �?prompt user
599
+ // 5. Handle MODIFIED files - prompt user
574
600
  let modifiedRemoved = 0;
575
601
  let modifiedKept = 0;
576
602
  let modifiedFailed = 0;
@@ -590,7 +616,7 @@ async function main() {
590
616
  }
591
617
  if (yes) {
592
618
  // Non-interactive mode: skip all modified
593
- console.log(` �?Skipped (modified): ${m.file}`);
619
+ console.log(` ! Skipped (modified): ${m.file}`);
594
620
  modifiedKept++;
595
621
  continue;
596
622
  }
@@ -602,17 +628,17 @@ async function main() {
602
628
  const answer = await askUser(' Choose [d/k]: ');
603
629
  if (answer === 'd' || answer === 'delete') {
604
630
  const diskPath = safePath(m.file);
605
- if (!diskPath) { console.error(` �?Traversal rejected: ${m.file}`); modifiedFailed++; continue; }
631
+ if (!diskPath) { console.error(` ! Traversal rejected: ${m.file}`); modifiedFailed++; continue; }
606
632
  try {
607
633
  unlinkSync(diskPath);
608
- console.log(` �?Deleted: ${m.file}`);
634
+ console.log(` Deleted: ${m.file}`);
609
635
  modifiedRemoved++;
610
636
  } catch (e) {
611
- console.error(` �?Failed: ${m.file} �?${e.message}`);
637
+ console.error(` ! Failed: ${m.file} - ${e.message}`);
612
638
  modifiedFailed++;
613
639
  }
614
640
  } else {
615
- console.log(` �?Kept: ${m.file}`);
641
+ console.log(` Kept: ${m.file}`);
616
642
  modifiedKept++;
617
643
  }
618
644
  }
@@ -673,7 +699,7 @@ async function main() {
673
699
  }
674
700
  } else if (!existsSync(harPath) || (existsSync(harPath) && readdirSync(harPath).filter(f => f !== '.harness-version').length === 0)) {
675
701
  unlinkSync(VERSION_FILE);
676
- console.log('�?Removed .harness-version (Harness directory empty).');
702
+ console.log('Removed .harness-version (Harness directory empty).');
677
703
  }
678
704
  }
679
705
 
@@ -692,7 +718,7 @@ async function main() {
692
718
  if (pruned > 0) {
693
719
  versionData.checksums = checksums;
694
720
  writeFileSync(VERSION_FILE, JSON.stringify(versionData, null, 2) + '\n', 'utf-8');
695
- console.log(`�?Pruned ${pruned} stale checksum(s) from .harness-version.`);
721
+ console.log(`Pruned ${pruned} stale checksum(s) from .harness-version.`);
696
722
  }
697
723
  }
698
724
 
@@ -706,7 +732,7 @@ async function main() {
706
732
  // Strip the harness section: everything from "## 1. Harness Binding" to the next "## "
707
733
  const cleaned = content.replace(/## 1\. Harness Binding[\s\S]*?(?=## 2\.)/, '');
708
734
  writeFileSync(claudePath, cleaned, 'utf-8');
709
- console.log('�?Stripped Harness binding section from CLAUDE.md.');
735
+ console.log('Stripped Harness binding section from CLAUDE.md.');
710
736
  }
711
737
  }
712
738
  }