@monoes/monodesign 1.2.20 → 1.2.23

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 (95) hide show
  1. package/README.md +2 -2
  2. package/cli/engine/cli/main.mjs +21 -1
  3. package/cli/engine/design-system-checks.mjs +381 -0
  4. package/cli/engine/design-system-parse.mjs +433 -0
  5. package/cli/engine/design-system.mjs +20 -736
  6. package/cli/engine/detect-antipatterns-browser.js +28 -5
  7. package/cli/engine/detect-antipatterns.mjs +1 -0
  8. package/cli/engine/engines/regex/detect-text-matchers.mjs +371 -0
  9. package/cli/engine/engines/regex/detect-text-run.mjs +186 -0
  10. package/cli/engine/engines/regex/detect-text.mjs +11 -523
  11. package/cli/engine/engines/static-html/css-cascade-color.mjs +219 -0
  12. package/cli/engine/engines/static-html/css-cascade-static-data.mjs +138 -0
  13. package/cli/engine/engines/static-html/css-cascade-static-dom.mjs +132 -0
  14. package/cli/engine/engines/static-html/css-cascade-static-parse.mjs +393 -0
  15. package/cli/engine/engines/static-html/css-cascade.mjs +24 -837
  16. package/cli/engine/engines/static-html/detect-html.mjs +6 -1
  17. package/cli/engine/findings-group.mjs +94 -0
  18. package/cli/engine/fix/index.mjs +1 -26
  19. package/cli/engine/fix/unified-diff.mjs +107 -0
  20. package/cli/engine/rules/checks-background.mjs +17 -3
  21. package/cli/engine/rules/checks-element.mjs +2 -0
  22. package/cli/engine/rules/checks-pure.mjs +9 -2
  23. package/cli/lib/monodesign-config-consent.mjs +93 -0
  24. package/cli/lib/monodesign-config-core.mjs +37 -0
  25. package/cli/lib/monodesign-config-detection.mjs +133 -0
  26. package/cli/lib/monodesign-config-filter.mjs +198 -0
  27. package/cli/lib/monodesign-config-ignore-value.mjs +212 -0
  28. package/cli/lib/monodesign-config.mjs +21 -623
  29. package/package.json +2 -2
  30. package/skill/scripts/context-fields.mjs +65 -0
  31. package/skill/scripts/context-resolve.mjs +425 -0
  32. package/skill/scripts/context-update.mjs +151 -0
  33. package/skill/scripts/context-utils.mjs +68 -0
  34. package/skill/scripts/context-workspace.mjs +245 -0
  35. package/skill/scripts/context.mjs +17 -891
  36. package/skill/scripts/hook-admin-config.mjs +152 -0
  37. package/skill/scripts/hook-admin-ignore.mjs +131 -0
  38. package/skill/scripts/hook-admin-manifest.mjs +292 -0
  39. package/skill/scripts/hook-admin.mjs +8 -541
  40. package/skill/scripts/hook-lib-cache.mjs +145 -0
  41. package/skill/scripts/hook-lib-config.mjs +292 -0
  42. package/skill/scripts/hook-lib-detector.mjs +72 -0
  43. package/skill/scripts/hook-lib-events.mjs +182 -0
  44. package/skill/scripts/hook-lib-findings.mjs +201 -0
  45. package/skill/scripts/hook-lib-ignore.mjs +205 -0
  46. package/skill/scripts/hook-lib-render.mjs +273 -0
  47. package/skill/scripts/hook-lib-run.mjs +281 -0
  48. package/skill/scripts/hook-lib-scan-targets.mjs +128 -0
  49. package/skill/scripts/hook-lib.mjs +71 -1747
  50. package/skill/scripts/lib/design-parser-colors.mjs +182 -0
  51. package/skill/scripts/lib/design-parser-extract.mjs +333 -0
  52. package/skill/scripts/lib/design-parser-sections.mjs +214 -0
  53. package/skill/scripts/lib/design-parser-yaml.mjs +135 -0
  54. package/skill/scripts/lib/design-parser.mjs +10 -783
  55. package/skill/scripts/live/manual-apply-chunk.mjs +151 -0
  56. package/skill/scripts/live/manual-apply-compact.mjs +122 -0
  57. package/skill/scripts/live/manual-apply-evidence.mjs +115 -0
  58. package/skill/scripts/live/manual-apply-log.mjs +179 -0
  59. package/skill/scripts/live/manual-apply-transaction.mjs +122 -0
  60. package/skill/scripts/live/manual-apply.mjs +65 -640
  61. package/skill/scripts/live/svelte-component-accept.mjs +248 -0
  62. package/skill/scripts/live/svelte-component-css.mjs +230 -0
  63. package/skill/scripts/live/svelte-component-markup.mjs +104 -0
  64. package/skill/scripts/live/svelte-component-scaffold.mjs +118 -0
  65. package/skill/scripts/live/svelte-component-session.mjs +158 -0
  66. package/skill/scripts/live/svelte-component.mjs +32 -792
  67. package/skill/scripts/live-accept-mutate.mjs +152 -0
  68. package/skill/scripts/live-accept-parse.mjs +370 -0
  69. package/skill/scripts/live-accept-scrub.mjs +59 -0
  70. package/skill/scripts/live-accept-search.mjs +58 -0
  71. package/skill/scripts/live-accept.mjs +15 -631
  72. package/skill/scripts/live-commit-manual-edits-paths.mjs +27 -0
  73. package/skill/scripts/live-commit-manual-edits-repair.mjs +166 -0
  74. package/skill/scripts/live-commit-manual-edits-rollback.mjs +231 -0
  75. package/skill/scripts/live-commit-manual-edits-utils.mjs +167 -0
  76. package/skill/scripts/live-commit-manual-edits-verify.mjs +356 -0
  77. package/skill/scripts/live-commit-manual-edits.mjs +24 -881
  78. package/skill/scripts/live-copy-edit-agent.mjs +16 -551
  79. package/skill/scripts/live-copy-edit-compact.mjs +137 -0
  80. package/skill/scripts/live-copy-edit-post-apply.mjs +175 -0
  81. package/skill/scripts/live-copy-edit-runners.mjs +297 -0
  82. package/skill/scripts/live-inject-csp.mjs +132 -0
  83. package/skill/scripts/live-inject-files.mjs +229 -0
  84. package/skill/scripts/live-inject-tag.mjs +114 -0
  85. package/skill/scripts/live-inject.mjs +13 -440
  86. package/skill/scripts/live-server-poll.mjs +232 -0
  87. package/skill/scripts/live-server-routes.mjs +449 -0
  88. package/skill/scripts/live-server-state.mjs +361 -0
  89. package/skill/scripts/live-server.mjs +10 -946
  90. package/skill/scripts/live-wrap-css.mjs +132 -0
  91. package/skill/scripts/live-wrap-manual-edit.mjs +153 -0
  92. package/skill/scripts/live-wrap-search.mjs +247 -0
  93. package/skill/scripts/live-wrap.mjs +21 -484
  94. package/skill/scripts/palette-seeds.mjs +401 -0
  95. package/skill/scripts/palette.mjs +1 -395
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Component-session lifecycle for live/svelte-component.mjs: where a
3
+ * session's scaffolded variants and manifest live on disk, finding/reading a
4
+ * manifest, removing sessions, and the deferred-accept queue used when an
5
+ * accept can't be applied synchronously (e.g. the live server restarts).
6
+ *
7
+ * Split out of live/svelte-component.mjs. See that file for context.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ import fs from 'node:fs';
11
+ import os from 'node:os';
12
+ import path from 'node:path';
13
+ import { inlineSvelteComponentAccept } from './svelte-component-accept.mjs';
14
+
15
+ export const SVELTE_COMPONENT_ROOT = 'node_modules/.monodesign-live';
16
+ export const SVELTE_RUNTIME_FILE = `${SVELTE_COMPONENT_ROOT}/__runtime.js`;
17
+ export const DEFERRED_ACCEPTS_FILE = '.monodesign/live/deferred-svelte-component-accepts.json';
18
+
19
+
20
+ export function shouldUseSvelteComponentInjection(filePath) {
21
+ if (/^(0|false|no)$/i.test(process.env.MONODESIGN_LIVE_SVELTE_COMPONENT || '')) return false;
22
+ return path.extname(filePath).toLowerCase() === '.svelte';
23
+ }
24
+
25
+ export function componentSessionDir(id, cwd = process.cwd()) {
26
+ return path.join(cwd, SVELTE_COMPONENT_ROOT, id);
27
+ }
28
+
29
+ export function manifestPathForSession(id, cwd = process.cwd()) {
30
+ return path.join(componentSessionDir(id, cwd), 'manifest.json');
31
+ }
32
+
33
+ export function ensureRuntimeHelper(cwd = process.cwd()) {
34
+ const file = path.join(cwd, SVELTE_RUNTIME_FILE);
35
+ if (fs.existsSync(file)) return file;
36
+ fs.mkdirSync(path.dirname(file), { recursive: true });
37
+ fs.writeFileSync(file, `export { mount, unmount } from 'svelte';\n`, 'utf-8');
38
+ return file;
39
+ }
40
+
41
+ export function findSvelteComponentManifest(id, cwd = process.cwd()) {
42
+ const direct = manifestPathForSession(id, cwd);
43
+ if (fs.existsSync(direct)) {
44
+ return readManifest(direct);
45
+ }
46
+ const root = path.join(cwd, SVELTE_COMPONENT_ROOT);
47
+ if (!fs.existsSync(root)) return null;
48
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
49
+ if (!entry.isDirectory()) continue;
50
+ const candidate = path.join(root, entry.name, 'manifest.json');
51
+ if (!fs.existsSync(candidate)) continue;
52
+ try {
53
+ const manifest = readManifest(candidate);
54
+ if (manifest?.id === id) return { ...manifest, manifestPath: candidate };
55
+ } catch { /* skip */ }
56
+ }
57
+ return null;
58
+ }
59
+
60
+ export function readManifest(manifestPath) {
61
+ const data = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
62
+ return {
63
+ ...data,
64
+ manifestPath,
65
+ };
66
+ }
67
+
68
+ export function resolveSourceFile(sourceFile, cwd = process.cwd()) {
69
+ if (!sourceFile || path.isAbsolute(sourceFile)) {
70
+ throw new Error('Invalid svelte-component source file');
71
+ }
72
+ const full = path.resolve(cwd, sourceFile);
73
+ const rel = path.relative(cwd, full).split(path.sep).join('/');
74
+ if (!rel || rel.startsWith('..') || path.isAbsolute(rel)) {
75
+ throw new Error('Svelte-component source file escapes project root');
76
+ }
77
+ if (!fs.existsSync(full)) {
78
+ throw new Error(`Svelte-component source file not found: ${sourceFile}`);
79
+ }
80
+ return full;
81
+ }
82
+
83
+ export function removeSvelteComponentSession(id, cwd = process.cwd()) {
84
+ const dir = componentSessionDir(id, cwd);
85
+ try {
86
+ fs.rmSync(dir, { recursive: true, force: true });
87
+ } catch { /* non-fatal */ }
88
+ }
89
+
90
+ export function removeAllSvelteComponentSessions(cwd = process.cwd()) {
91
+ const root = path.join(cwd, SVELTE_COMPONENT_ROOT);
92
+ if (!fs.existsSync(root)) return;
93
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
94
+ if (!entry.isDirectory()) continue;
95
+ if (entry.name.startsWith('__')) continue;
96
+ try {
97
+ fs.rmSync(path.join(root, entry.name), { recursive: true, force: true });
98
+ } catch { /* non-fatal */ }
99
+ }
100
+ }
101
+
102
+ export function deferredAcceptsPath(cwd = process.cwd()) {
103
+ const key = createHash('sha1').update(path.resolve(cwd)).digest('hex').slice(0, 16);
104
+ return path.join(os.tmpdir(), 'monodesign-live', key, 'deferred-svelte-component-accepts.json');
105
+ }
106
+
107
+ export function readDeferredAccepts(cwd = process.cwd()) {
108
+ const file = deferredAcceptsPath(cwd);
109
+ try {
110
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
111
+ } catch {
112
+ return { accepts: [] };
113
+ }
114
+ }
115
+
116
+ export function writeDeferredAccept(entry, cwd = process.cwd()) {
117
+ const file = deferredAcceptsPath(cwd);
118
+ fs.mkdirSync(path.dirname(file), { recursive: true });
119
+ const data = readDeferredAccepts(cwd);
120
+ data.accepts = (data.accepts || []).filter((item) => item.id !== entry.id);
121
+ data.accepts.push({ ...entry, createdAt: new Date().toISOString() });
122
+ fs.writeFileSync(file, `${JSON.stringify(data, null, 2)}\n`, 'utf-8');
123
+ }
124
+
125
+ export function applyDeferredSvelteComponentAccepts(cwd = process.cwd()) {
126
+ const file = deferredAcceptsPath(cwd);
127
+ const data = readDeferredAccepts(cwd);
128
+ const pending = Array.isArray(data.accepts) ? data.accepts : [];
129
+ const results = [];
130
+ const remaining = [];
131
+ for (const entry of pending) {
132
+ try {
133
+ const manifest = findSvelteComponentManifest(entry.id, cwd);
134
+ if (!manifest) {
135
+ results.push({ id: entry.id, ok: false, error: 'manifest not found' });
136
+ remaining.push(entry);
137
+ continue;
138
+ }
139
+ const result = inlineSvelteComponentAccept(
140
+ manifest,
141
+ entry.variantNum,
142
+ entry.paramValues || null,
143
+ cwd,
144
+ );
145
+ results.push({ id: entry.id, ok: result.handled !== false, result });
146
+ if (result.handled === false) remaining.push(entry);
147
+ } catch (err) {
148
+ results.push({ id: entry.id, ok: false, error: err.message });
149
+ remaining.push(entry);
150
+ }
151
+ }
152
+ if (remaining.length > 0) {
153
+ fs.writeFileSync(file, `${JSON.stringify({ accepts: remaining }, null, 2)}\n`, 'utf-8');
154
+ } else {
155
+ try { fs.rmSync(file, { force: true }); } catch {}
156
+ }
157
+ return { applied: results.filter((r) => r.ok).length, failed: results.filter((r) => !r.ok).length, results };
158
+ }