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.
- package/CHANGELOG.md +165 -0
- package/README-CN.md +41 -9
- package/README.md +39 -9
- package/package.json +2 -1
- package/src/generator.js +601 -472
- package/src/index.js +4 -4
- package/templates/common/.claude/agents/architect-manager.md +1 -0
- package/templates/common/.claude/agents/architect.md +2 -1
- package/templates/common/.claude/agents/codebase-explorer.md +1 -0
- package/templates/common/.claude/agents/context-master.md +2 -1
- package/templates/common/.claude/agents/debugger.md +1 -0
- package/templates/common/.claude/agents/docs-researcher.md +2 -1
- package/templates/common/.claude/agents/explore-manager.md +1 -0
- package/templates/common/.claude/agents/implement-manager.md +1 -0
- package/templates/common/.claude/agents/implementer.md +1 -0
- package/templates/common/.claude/agents/memory-master.md +2 -1
- package/templates/common/.claude/agents/planner.md +3 -2
- package/templates/common/.claude/agents/reflector.md +1 -0
- package/templates/common/.claude/agents/researcher.md +1 -0
- package/templates/common/.claude/agents/review-manager.md +1 -0
- package/templates/common/.claude/agents/reviewer.md +2 -1
- package/templates/common/.claude/agents/task-scribe.md +1 -0
- package/templates/common/.claude/agents/tdd-guide.md +5 -4
- package/templates/common/.claude/agents/test-writer.md +6 -5
- package/templates/common/.claude/agents/verifier.md +1 -0
- package/templates/common/.claude/commands/wf-help.md +1 -0
- package/templates/common/.claude/commands/wf-update.md +68 -10
- package/templates/common/.claude/rules/ecc/common.md +6 -5
- package/templates/common/.claude/skills/subagent-orchestrator/SKILL.md +12 -6
- package/templates/common/.claude/skills/tdd/SKILL.md +5 -5
- package/templates/common/.claude/skills/wf/SKILL.md +13 -5
- package/templates/common/.claude/skills/wf-agents-docs/SKILL.md +119 -0
- package/templates/common/.claude/skills/wf-auto/SKILL.md +27 -7
- package/templates/common/.claude/skills/wf-auto-spark/SKILL.md +12 -5
- package/templates/common/.claude/skills/wf-learn/SKILL.md +6 -0
- package/templates/common/.claude/skills/wf-max/SKILL.md +22 -7
- package/templates/common/.claude/skills/wf-readme/SKILL.md +8 -2
- package/templates/common/.claude/skills/wf-remove/SKILL.md +6 -0
- package/templates/common/.claude/skills/wf-review/SKILL.md +10 -3
- package/templates/common/.claude/skills/wf-update/SKILL.md +41 -4
- package/templates/common/.harness-version +290 -128
- package/templates/common/.opencode/agents/architect-manager.md +1 -0
- package/templates/common/.opencode/agents/architect.md +2 -1
- package/templates/common/.opencode/agents/codebase-explorer.md +1 -0
- package/templates/common/.opencode/agents/context-master.md +2 -1
- package/templates/common/.opencode/agents/debugger.md +1 -0
- package/templates/common/.opencode/agents/docs-researcher.md +2 -1
- package/templates/common/.opencode/agents/explore-manager.md +1 -0
- package/templates/common/.opencode/agents/implement-manager.md +1 -0
- package/templates/common/.opencode/agents/implementer.md +1 -0
- package/templates/common/.opencode/agents/memory-master.md +2 -1
- package/templates/common/.opencode/agents/planner.md +3 -2
- package/templates/common/.opencode/agents/reflector.md +1 -0
- package/templates/common/.opencode/agents/researcher.md +1 -0
- package/templates/common/.opencode/agents/review-manager.md +1 -0
- package/templates/common/.opencode/agents/reviewer.md +2 -1
- package/templates/common/.opencode/agents/task-scribe.md +1 -0
- package/templates/common/.opencode/agents/tdd-guide.md +5 -4
- package/templates/common/.opencode/agents/test-writer.md +6 -5
- package/templates/common/.opencode/agents/verifier.md +1 -0
- package/templates/common/.opencode/commands/wf-auto-spark.md +3 -2
- package/templates/common/.opencode/commands/wf-auto.md +3 -2
- package/templates/common/.opencode/commands/wf-help.md +1 -0
- package/templates/common/.opencode/commands/wf-learn.md +3 -2
- package/templates/common/.opencode/commands/wf-max.md +3 -2
- package/templates/common/.opencode/commands/wf-readme.md +3 -2
- package/templates/common/.opencode/commands/wf-remove.md +3 -2
- package/templates/common/.opencode/commands/wf-review.md +3 -2
- package/templates/common/.opencode/commands/wf-update.md +68 -10
- package/templates/common/.opencode/commands/wf.md +3 -2
- package/templates/common/CLAUDE.md +14 -12
- package/templates/common/Harness/MEMORY.md +21 -18
- package/templates/common/Harness/README.md +41 -39
- package/templates/common/Harness/ownership.manifest.json +815 -0
- package/templates/common/Harness/{architecture.md → project/architecture.md} +1 -1
- package/templates/common/Harness/research/README.md +3 -3
- package/templates/common/Harness/scripts/context-budget.mjs +95 -0
- package/templates/common/Harness/scripts/l2-cache-telemetry.mjs +703 -0
- package/templates/common/Harness/scripts/scan-clean.mjs +13 -3
- package/templates/common/Harness/scripts/validate-harness.mjs +332 -175
- package/templates/common/Harness/scripts/wf-remove.mjs +60 -34
- package/templates/common/Harness/scripts/wf-update-check.mjs +355 -45
- package/templates/common/Harness/settings.json +43 -0
- package/templates/common/Harness/{ECC-GUIDE.md → specs/guides/ECC-GUIDE.md} +4 -4
- package/templates/common/Harness/{SETUP.md → specs/guides/SETUP.md} +32 -35
- package/templates/common/Harness/{extension.md → specs/guides/extension.md} +3 -3
- package/templates/common/Harness/{lifecycle.md → specs/guides/lifecycle.md} +2 -2
- package/templates/common/Harness/{agent-workflow.md → specs/runtime/agent-workflow.md} +6 -6
- package/templates/common/Harness/{context-loading.md → specs/runtime/context-loading.md} +85 -21
- package/templates/common/Harness/{dispatch.md → specs/runtime/dispatch.md} +3 -2
- package/templates/common/Harness/{subagents.md → specs/runtime/subagents.md} +10 -5
- package/templates/common/Harness/{WF-AUTO-SPARK.md → specs/workflows/WF-AUTO-SPARK.md} +2 -2
- package/templates/common/Harness/{WF-AUTO.md → specs/workflows/WF-AUTO.md} +6 -1
- package/templates/common/Harness/{WF-KERNEL.md → specs/workflows/WF-KERNEL.md} +10 -0
- package/templates/common/Harness/{WF-MAX.md → specs/workflows/WF-MAX.md} +10 -5
- package/templates/common/Harness/{WF-STATE.md → specs/workflows/WF-STATE.md} +5 -0
- package/templates/common/Harness/{WF.md → specs/workflows/WF.md} +12 -1
- package/templates/common/README.md +8 -6
- package/templates/common/memory/startup-hints.md +19 -17
- package/templates/optional/skills/browser-e2e/.claude/skills/browser-e2e/SKILL.md +1 -1
- package/templates/optional/skills/browser-e2e/.claude/skills/wf-browser/SKILL.md +7 -0
- package/templates/optional/skills/browser-e2e/.opencode/commands/wf-browser.md +3 -2
- package/templates/optional/skills/browser-e2e/Harness/workflows/browser-e2e.md +4 -4
- package/templates/optional/skills/github-pr-review/.claude/skills/github-pr-review/SKILL.md +1 -1
- package/templates/optional/skills/python-backend/.claude/skills/python-backend/SKILL.md +1 -1
- package/templates/optional/skills/ts-react-frontend/.claude/skills/ts-react-frontend/SKILL.md +1 -1
- package/templates/optional/skills/ui-ux-review/.claude/skills/ui-ux-review/SKILL.md +1 -1
- /package/templates/common/Harness/{ACCEPTANCE_PROTOCOL.md → specs/protocols/ACCEPTANCE_PROTOCOL.md} +0 -0
- /package/templates/common/Harness/{AGENT_ISOLATION.md → specs/protocols/AGENT_ISOLATION.md} +0 -0
- /package/templates/common/Harness/{DEBUG_PROTOCOL.md → specs/protocols/DEBUG_PROTOCOL.md} +0 -0
- /package/templates/common/Harness/{HARNESS_BRIDGE.md → specs/protocols/HARNESS_BRIDGE.md} +0 -0
- /package/templates/common/Harness/{MEMORY_PROTOCOL.md → specs/protocols/MEMORY_PROTOCOL.md} +0 -0
- /package/templates/common/Harness/{TASK_ARCHIVE.md → specs/protocols/TASK_ARCHIVE.md} +0 -0
- /package/templates/common/Harness/{TDD-GUIDE.md → specs/protocols/TDD-GUIDE.md} +0 -0
- /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
|
|
3
|
+
* wf-remove.mjs - Safely remove Harness framework files.
|
|
4
4
|
*
|
|
5
5
|
* Classifies all Harness-owned files into:
|
|
6
|
-
* SAFE
|
|
7
|
-
* MODIFIED
|
|
8
|
-
* USER
|
|
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
|
|
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
|
|
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
|
|
394
|
-
const modified = []; // MODIFIED
|
|
395
|
-
const user = []; // USER
|
|
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
|
|
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
|
|
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
|
|
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('\
|
|
540
|
+
console.log('\nWF-REMOVE - Harness framework removal plan\n');
|
|
515
541
|
|
|
516
542
|
if (safe.length > 0) {
|
|
517
|
-
console.log(
|
|
518
|
-
for (const s of safe) console.log(`
|
|
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(
|
|
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(
|
|
532
|
-
for (const u of user) console.log(`
|
|
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
|
|
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(`
|
|
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(`
|
|
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(`
|
|
593
|
+
console.error(` ! Failed to remove: ${s.file} - ${e.message}`);
|
|
568
594
|
safeFailed++;
|
|
569
595
|
}
|
|
570
596
|
}
|
|
571
|
-
console.log(
|
|
597
|
+
console.log(`Removed ${safeRemoved} safe files.`);
|
|
572
598
|
|
|
573
|
-
// 5. Handle MODIFIED files
|
|
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(`
|
|
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(`
|
|
631
|
+
if (!diskPath) { console.error(` ! Traversal rejected: ${m.file}`); modifiedFailed++; continue; }
|
|
606
632
|
try {
|
|
607
633
|
unlinkSync(diskPath);
|
|
608
|
-
console.log(`
|
|
634
|
+
console.log(` Deleted: ${m.file}`);
|
|
609
635
|
modifiedRemoved++;
|
|
610
636
|
} catch (e) {
|
|
611
|
-
console.error(`
|
|
637
|
+
console.error(` ! Failed: ${m.file} - ${e.message}`);
|
|
612
638
|
modifiedFailed++;
|
|
613
639
|
}
|
|
614
640
|
} else {
|
|
615
|
-
console.log(`
|
|
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('
|
|
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(
|
|
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('
|
|
735
|
+
console.log('Stripped Harness binding section from CLAUDE.md.');
|
|
710
736
|
}
|
|
711
737
|
}
|
|
712
738
|
}
|