@mcptoolshop/style-dataset-lab 2.3.0 → 3.0.1

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 (106) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/CODE_OF_CONDUCT.md +9 -0
  3. package/CONTRIBUTING.md +71 -0
  4. package/README.md +82 -9
  5. package/SECURITY.md +6 -5
  6. package/bin/sdlab.js +359 -11
  7. package/lib/adapters/comfyui-runner.js +170 -0
  8. package/lib/adapters/comfyui-workflows.js +163 -0
  9. package/lib/adapters/diffusers-lora.js +7 -2
  10. package/lib/adapters/generic-image-caption.js +6 -1
  11. package/lib/args.js +200 -13
  12. package/lib/batch-compiler.js +122 -0
  13. package/lib/batch-modes.js +111 -0
  14. package/lib/batch-runs.js +237 -0
  15. package/lib/batch-sheet-render.js +209 -0
  16. package/lib/brief-compiler.js +625 -0
  17. package/lib/brief-render.js +205 -0
  18. package/lib/card.js +11 -4
  19. package/lib/comfyui.js +100 -6
  20. package/lib/config.js +68 -3
  21. package/lib/critique-engine.js +413 -0
  22. package/lib/critique-render.js +171 -0
  23. package/lib/deprecation.js +1 -1
  24. package/lib/eval-pack.js +94 -4
  25. package/lib/eval-runs.js +42 -3
  26. package/lib/export.js +144 -34
  27. package/lib/generated-provenance.js +87 -0
  28. package/lib/implementation-packs.js +15 -1
  29. package/lib/log.js +41 -4
  30. package/lib/paths.js +72 -3
  31. package/lib/refine-briefs.js +336 -0
  32. package/lib/reingest-selected.js +184 -0
  33. package/lib/reingest.js +15 -1
  34. package/lib/run-summary.js +132 -0
  35. package/lib/runtime-runs.js +218 -0
  36. package/lib/selections.js +375 -0
  37. package/lib/snapshot.js +100 -7
  38. package/lib/split.js +175 -17
  39. package/lib/training-manifests.js +17 -3
  40. package/lib/training-packages.js +28 -14
  41. package/lib/workflow-profiles.js +161 -0
  42. package/package.json +13 -4
  43. package/scripts/batch-generate.js +176 -0
  44. package/scripts/batch-sheet.js +46 -0
  45. package/scripts/batch-show.js +86 -0
  46. package/scripts/brief-compile.js +134 -0
  47. package/scripts/brief-show.js +53 -0
  48. package/scripts/canon-bind.js +7 -9
  49. package/scripts/card.js +22 -25
  50. package/scripts/compare.js +38 -33
  51. package/scripts/critique-show.js +50 -0
  52. package/scripts/critique.js +70 -0
  53. package/scripts/curate.js +91 -46
  54. package/scripts/doctor.js +172 -6
  55. package/scripts/eligibility.js +17 -14
  56. package/scripts/eval-pack.js +13 -11
  57. package/scripts/eval-run.js +30 -29
  58. package/scripts/export.js +27 -31
  59. package/scripts/generate-controlnet.js +31 -17
  60. package/scripts/generate-identity.js +37 -20
  61. package/scripts/generate-ipadapter.js +22 -16
  62. package/scripts/generate.js +68 -13
  63. package/scripts/implementation-pack.js +19 -14
  64. package/scripts/init.js +137 -17
  65. package/scripts/painterly.js +8 -10
  66. package/scripts/refine.js +119 -0
  67. package/scripts/reingest-selected.js +78 -0
  68. package/scripts/reingest.js +37 -18
  69. package/scripts/run-generate.js +76 -0
  70. package/scripts/run-list.js +58 -0
  71. package/scripts/run-show.js +63 -0
  72. package/scripts/select.js +119 -0
  73. package/scripts/selection-show.js +88 -0
  74. package/scripts/snapshot.js +22 -24
  75. package/scripts/split.js +26 -31
  76. package/scripts/training-manifest.js +29 -24
  77. package/scripts/training-package.js +24 -20
  78. package/scripts/training-profile.js +13 -8
  79. package/scripts/workflow-list.js +61 -0
  80. package/scripts/workflow-show.js +97 -0
  81. package/templates/domains/architecture/inputs/prompts/example-wave.json +32 -0
  82. package/templates/domains/architecture/terminology.json +10 -8
  83. package/templates/domains/architecture/workflows/profiles/environment-moodboard.json +62 -0
  84. package/templates/domains/architecture/workflows/profiles/interior-variant-pack.json +60 -0
  85. package/templates/domains/character-design/inputs/prompts/example-wave.json +32 -0
  86. package/templates/domains/character-design/project.json +4 -2
  87. package/templates/domains/character-design/workflows/profiles/character-portrait-set.json +61 -0
  88. package/templates/domains/character-design/workflows/profiles/expression-sheet.json +59 -0
  89. package/templates/domains/creature-design/inputs/prompts/example-wave.json +32 -0
  90. package/templates/domains/creature-design/project.json +4 -2
  91. package/templates/domains/creature-design/terminology.json +1 -0
  92. package/templates/domains/creature-design/workflows/profiles/creature-portrait-set.json +61 -0
  93. package/templates/domains/creature-design/workflows/profiles/silhouette-exploration.json +58 -0
  94. package/templates/domains/game-art/inputs/prompts/example-wave.json +37 -0
  95. package/templates/domains/game-art/project.json +4 -2
  96. package/templates/domains/game-art/workflows/profiles/character-portrait-set.json +62 -0
  97. package/templates/domains/game-art/workflows/profiles/environment-moodboard.json +61 -0
  98. package/templates/domains/vehicle-mech/inputs/prompts/example-wave.json +37 -0
  99. package/templates/domains/vehicle-mech/project.json +4 -2
  100. package/templates/domains/vehicle-mech/workflows/profiles/variant-pack.json +60 -0
  101. package/templates/domains/vehicle-mech/workflows/profiles/vehicle-silhouette-pack.json +59 -0
  102. package/scripts/bulk-curate-wave2-5.js +0 -138
  103. package/scripts/bulk-curate-waves11-18.js +0 -413
  104. package/scripts/curate-wave25.js +0 -209
  105. package/scripts/migrate-records.js +0 -141
  106. package/templates/inputs/prompts/example-wave.json +0 -27
@@ -1,141 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * migrate-records.js — One-time migration for curator-divergent records (Shape 2 + Shape 4)
4
- *
5
- * Normalizes verdict/scores/explanation/failures/curated_at/curator at top level
6
- * into the standard judgment.{status,criteria_scores,explanation,failure_modes,reviewed_at,reviewer} shape.
7
- *
8
- * Also fixes asset_path from outputs/candidates/ to outputs/approved/ when the image exists in approved/.
9
- *
10
- * DOES NOT TOUCH Shape 3 (identity packet) records — those have judgment=null by design.
11
- *
12
- * Usage:
13
- * node scripts/migrate-records.js --dry-run # Preview changes
14
- * node scripts/migrate-records.js # Apply changes
15
- * sdlab project migrate --dry-run --project star-freight
16
- */
17
-
18
- import { readdir, readFile, writeFile, access } from 'node:fs/promises';
19
- import { join, basename } from 'node:path';
20
- import { getProjectName } from '../lib/args.js';
21
- import { REPO_ROOT } from '../lib/paths.js';
22
-
23
- async function fileExists(p) {
24
- try { await access(p); return true; } catch { return false; }
25
- }
26
-
27
- function isCuratorDivergent(rec) {
28
- return rec.judgment === null && typeof rec.verdict === 'string' && !rec.identity;
29
- }
30
-
31
- function isIdentityRecord(rec) {
32
- return rec.identity != null;
33
- }
34
-
35
- async function migrateRecord(filePath, GAME_ROOT, DRY_RUN) {
36
- const raw = await readFile(filePath, 'utf-8');
37
- const rec = JSON.parse(raw);
38
-
39
- if (isIdentityRecord(rec)) return { file: basename(filePath), action: 'skip-identity' };
40
-
41
- if (!isCuratorDivergent(rec)) {
42
- if (rec.asset_path && rec.asset_path.includes('outputs/candidates/')) {
43
- const approvedPath = rec.asset_path.replace('outputs/candidates/', 'outputs/approved/');
44
- const fullApproved = join(GAME_ROOT, approvedPath);
45
- if (await fileExists(fullApproved)) {
46
- rec.asset_path = approvedPath;
47
- if (!DRY_RUN) await writeFile(filePath, JSON.stringify(rec, null, 2) + '\n');
48
- return { file: basename(filePath), action: 'path-fix-only', from: 'candidates/', to: 'approved/' };
49
- }
50
- }
51
- return { file: basename(filePath), action: 'skip-standard' };
52
- }
53
-
54
- const changes = [];
55
-
56
- rec.judgment = {
57
- status: rec.verdict || 'unknown',
58
- reviewer: rec.curator || 'wave25-script',
59
- reviewed_at: rec.curated_at || new Date().toISOString(),
60
- explanation: rec.explanation || '',
61
- criteria_scores: rec.scores || {},
62
- failure_modes: rec.failures || [],
63
- improvement_notes: null,
64
- confidence: 0.8,
65
- };
66
- changes.push(`verdict="${rec.verdict}" → judgment.status`);
67
-
68
- delete rec.verdict;
69
- delete rec.scores;
70
- delete rec.explanation;
71
- delete rec.failures;
72
- delete rec.curated_at;
73
- delete rec.curator;
74
- changes.push('removed top-level verdict/scores/explanation/failures/curated_at/curator');
75
-
76
- if (rec.asset_path && rec.asset_path.includes('outputs/candidates/')) {
77
- const approvedPath = rec.asset_path.replace('outputs/candidates/', 'outputs/approved/');
78
- const fullApproved = join(GAME_ROOT, approvedPath);
79
- if (await fileExists(fullApproved)) {
80
- rec.asset_path = approvedPath;
81
- changes.push(`asset_path: candidates/ → approved/`);
82
- } else {
83
- changes.push(`asset_path: candidates/ (image not in approved/, kept as-is)`);
84
- }
85
- }
86
-
87
- if (!DRY_RUN) {
88
- await writeFile(filePath, JSON.stringify(rec, null, 2) + '\n');
89
- }
90
-
91
- return { file: basename(filePath), action: 'migrated', changes };
92
- }
93
-
94
- export async function run(argv = process.argv.slice(2)) {
95
- const projectName = getProjectName(argv);
96
- const GAME_ROOT = join(REPO_ROOT, 'projects', projectName);
97
- const RECORDS_DIR = join(GAME_ROOT, 'records');
98
- const DRY_RUN = argv.includes('--dry-run');
99
-
100
- console.log(DRY_RUN ? '=== DRY RUN ===' : '=== APPLYING MIGRATION ===');
101
-
102
- const files = (await readdir(RECORDS_DIR)).filter(f => f.endsWith('.json'));
103
- console.log(`Found ${files.length} record files\n`);
104
-
105
- const results = { skipped: 0, migrated: 0, pathFixed: 0, identity: 0, errors: 0 };
106
-
107
- for (const file of files) {
108
- try {
109
- const result = await migrateRecord(join(RECORDS_DIR, file), GAME_ROOT, DRY_RUN);
110
- switch (result.action) {
111
- case 'skip-standard': results.skipped++; break;
112
- case 'skip-identity': results.identity++; break;
113
- case 'migrated':
114
- results.migrated++;
115
- console.log(`MIGRATE: ${result.file}`);
116
- result.changes.forEach(c => console.log(` → ${c}`));
117
- break;
118
- case 'path-fix-only':
119
- results.pathFixed++;
120
- console.log(`PATH-FIX: ${result.file} (${result.from} → ${result.to})`);
121
- break;
122
- }
123
- } catch (err) {
124
- results.errors++;
125
- console.error(`ERROR: ${file}: ${err.message}`);
126
- }
127
- }
128
-
129
- console.log(`\n=== Summary ===`);
130
- console.log(`Standard (unchanged): ${results.skipped}`);
131
- console.log(`Identity (untouched): ${results.identity}`);
132
- console.log(`Migrated (schema fix): ${results.migrated}`);
133
- console.log(`Path-fixed only: ${results.pathFixed}`);
134
- console.log(`Errors: ${results.errors}`);
135
- console.log(`Total: ${files.length}`);
136
- }
137
-
138
- // Direct execution guard
139
- if (process.argv[1] && (process.argv[1].endsWith('migrate-records.js') || process.argv[1].endsWith('migrate-records'))) {
140
- run().catch(err => { console.error(err.message || err); process.exit(1); });
141
- }
@@ -1,27 +0,0 @@
1
- {
2
- "wave": "wave1",
3
- "description": "First generation wave — core subjects for your visual style",
4
- "defaults": {
5
- "checkpoint": "dreamshaperXL_v21TurboDPMSDE.safetensors",
6
- "lora": { "name": "classipeintxl_v21.safetensors", "weight": 1.0 },
7
- "width": 1024,
8
- "height": 1024,
9
- "steps": 8,
10
- "cfg": 2.0,
11
- "sampler": "dpmpp_sde",
12
- "scheduler": "karras",
13
- "negative": "photorealistic, photograph, 3d render, smooth CG, sharp photo detail"
14
- },
15
- "subjects": [
16
- {
17
- "id": "subject_a",
18
- "variations": 2,
19
- "prompt": "oil painting, visible brushstrokes, [DESCRIBE YOUR SUBJECT HERE], painterly concept art, canvas grain"
20
- },
21
- {
22
- "id": "subject_b",
23
- "variations": 2,
24
- "prompt": "oil painting, visible brushstrokes, [DESCRIBE YOUR SUBJECT HERE], painterly concept art, canvas grain"
25
- }
26
- ]
27
- }