visual-prompt-kit 0.1.0

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 (35) hide show
  1. package/README.md +254 -0
  2. package/bin/visual-prompt.js +5 -0
  3. package/docs/keyword-authoring.md +207 -0
  4. package/package.json +43 -0
  5. package/skills/image-prompt-composer/SKILL.md +40 -0
  6. package/skills/image-prompt-composer/agents/openai.yaml +4 -0
  7. package/src/cli.js +261 -0
  8. package/src/define.js +78 -0
  9. package/src/generator/export.js +20 -0
  10. package/src/generator/generateTags.js +64 -0
  11. package/src/generator/index.js +8 -0
  12. package/src/generator/locks.js +40 -0
  13. package/src/generator/pick.js +27 -0
  14. package/src/generator/seed.js +28 -0
  15. package/src/index.js +23 -0
  16. package/src/prompt/buildPromptRequest.js +63 -0
  17. package/src/prompt/index.js +7 -0
  18. package/src/prompt/serializePromptRequest.js +21 -0
  19. package/src/themes/index.js +43 -0
  20. package/src/themes/sweet-girl/dimensions/camera.js +42 -0
  21. package/src/themes/sweet-girl/dimensions/expression.js +42 -0
  22. package/src/themes/sweet-girl/dimensions/facial.js +34 -0
  23. package/src/themes/sweet-girl/dimensions/lighting.js +34 -0
  24. package/src/themes/sweet-girl/dimensions/outfit.js +44 -0
  25. package/src/themes/sweet-girl/dimensions/pose.js +66 -0
  26. package/src/themes/sweet-girl/dimensions/scene.js +102 -0
  27. package/src/themes/sweet-girl/dimensions/style.js +32 -0
  28. package/src/themes/sweet-girl/dimensions/subject.js +38 -0
  29. package/src/themes/sweet-girl/dimensions/vibe.js +34 -0
  30. package/src/themes/sweet-girl/index.js +1 -0
  31. package/src/themes/sweet-girl/manifest.js +50 -0
  32. package/src/themes/sweet-girl/presets/index.js +26 -0
  33. package/src/validate/index.js +5 -0
  34. package/src/validate/rules.js +5 -0
  35. package/src/validate/theme.js +79 -0
@@ -0,0 +1,79 @@
1
+ const { MAX_TEXT_LENGTH } = require("./rules");
2
+
3
+ function validateTheme(theme) {
4
+ const errors = [];
5
+ const warnings = [];
6
+ const seenDimensionKeys = new Set();
7
+
8
+ for (const dimension of theme.dimensions) {
9
+ if (seenDimensionKeys.has(dimension.key)) {
10
+ errors.push(`Duplicate dimension key: ${dimension.key}`);
11
+ continue;
12
+ }
13
+ seenDimensionKeys.add(dimension.key);
14
+
15
+ if (dimension.items.length < dimension.minimumItems) {
16
+ warnings.push(
17
+ `Dimension "${dimension.key}" has ${dimension.items.length} items, below the recommended floor ${dimension.minimumItems}.`
18
+ );
19
+ }
20
+
21
+ const seenTexts = new Set();
22
+ for (const item of dimension.items) {
23
+ if (!item.text || typeof item.text !== "string") {
24
+ errors.push(`Dimension "${dimension.key}" contains an invalid keyword entry.`);
25
+ continue;
26
+ }
27
+
28
+ if (item.text.length > MAX_TEXT_LENGTH) {
29
+ errors.push(`Keyword "${item.text}" in "${dimension.key}" exceeds ${MAX_TEXT_LENGTH} characters.`);
30
+ }
31
+
32
+ if (seenTexts.has(item.text)) {
33
+ errors.push(`Duplicate keyword "${item.text}" in "${dimension.key}".`);
34
+ }
35
+ seenTexts.add(item.text);
36
+
37
+ for (const term of theme.bannedLexicon) {
38
+ if (item.text.includes(term)) {
39
+ errors.push(`Keyword "${item.text}" in "${dimension.key}" contains banned term "${term}".`);
40
+ }
41
+ }
42
+
43
+ for (const term of dimension.forbiddenTerms) {
44
+ if (item.text.includes(term)) {
45
+ errors.push(`Keyword "${item.text}" in "${dimension.key}" contains forbidden term "${term}".`);
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ for (const [presetName, preset] of Object.entries(theme.presets || {})) {
52
+ for (const [dimensionKey, values] of Object.entries(preset)) {
53
+ const dimension = theme.dimensions.find((entry) => entry.key === dimensionKey);
54
+ if (!dimension) {
55
+ errors.push(`Preset "${presetName}" references unknown dimension "${dimensionKey}".`);
56
+ continue;
57
+ }
58
+
59
+ for (const value of values) {
60
+ const exists = dimension.items.some((item) => item.text === value);
61
+ if (!exists) {
62
+ errors.push(
63
+ `Preset "${presetName}" references missing keyword "${value}" in dimension "${dimensionKey}".`
64
+ );
65
+ }
66
+ }
67
+ }
68
+ }
69
+
70
+ return {
71
+ valid: errors.length === 0,
72
+ errors,
73
+ warnings
74
+ };
75
+ }
76
+
77
+ module.exports = {
78
+ validateTheme
79
+ };