mythik-cli 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.
- package/LICENSE +201 -0
- package/NOTICE +4 -0
- package/README.md +71 -0
- package/dist/api.d.ts +22 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +17 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +519 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/contract.d.ts +12 -0
- package/dist/commands/contract.d.ts.map +1 -0
- package/dist/commands/contract.js +133 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/delete.d.ts +9 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +46 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/diff.d.ts +11 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +49 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/docs.d.ts +15 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +117 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/elements.d.ts +9 -0
- package/dist/commands/elements.d.ts.map +1 -0
- package/dist/commands/elements.js +48 -0
- package/dist/commands/elements.js.map +1 -0
- package/dist/commands/envs.d.ts +11 -0
- package/dist/commands/envs.d.ts.map +1 -0
- package/dist/commands/envs.js +54 -0
- package/dist/commands/envs.js.map +1 -0
- package/dist/commands/history.d.ts +10 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +67 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +120 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +9 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +15 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/manifest.d.ts +11 -0
- package/dist/commands/manifest.d.ts.map +1 -0
- package/dist/commands/manifest.js +48 -0
- package/dist/commands/manifest.js.map +1 -0
- package/dist/commands/patch.d.ts +12 -0
- package/dist/commands/patch.d.ts.map +1 -0
- package/dist/commands/patch.js +103 -0
- package/dist/commands/patch.js.map +1 -0
- package/dist/commands/promote.d.ts +15 -0
- package/dist/commands/promote.d.ts.map +1 -0
- package/dist/commands/promote.js +83 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/pull.d.ts +9 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +36 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push-bulk.d.ts +11 -0
- package/dist/commands/push-bulk.d.ts.map +1 -0
- package/dist/commands/push-bulk.js +112 -0
- package/dist/commands/push-bulk.js.map +1 -0
- package/dist/commands/push.d.ts +19 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +102 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/rollback.d.ts +13 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +78 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/tokens.d.ts +8 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +63 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/commands/validate.d.ts +8 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +60 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +112 -0
- package/dist/config.js.map +1 -0
- package/dist/input-resolver.d.ts +22 -0
- package/dist/input-resolver.d.ts.map +1 -0
- package/dist/input-resolver.js +55 -0
- package/dist/input-resolver.js.map +1 -0
- package/dist/levenshtein.d.ts +2 -0
- package/dist/levenshtein.d.ts.map +1 -0
- package/dist/levenshtein.js +2 -0
- package/dist/levenshtein.js.map +1 -0
- package/dist/lint/code-rules.d.ts +30 -0
- package/dist/lint/code-rules.d.ts.map +1 -0
- package/dist/lint/code-rules.js +81 -0
- package/dist/lint/code-rules.js.map +1 -0
- package/dist/lint/format.d.ts +12 -0
- package/dist/lint/format.d.ts.map +1 -0
- package/dist/lint/format.js +68 -0
- package/dist/lint/format.js.map +1 -0
- package/dist/lint/orchestrator.d.ts +17 -0
- package/dist/lint/orchestrator.d.ts.map +1 -0
- package/dist/lint/orchestrator.js +124 -0
- package/dist/lint/orchestrator.js.map +1 -0
- package/dist/lint/spec-discovery.d.ts +14 -0
- package/dist/lint/spec-discovery.d.ts.map +1 -0
- package/dist/lint/spec-discovery.js +72 -0
- package/dist/lint/spec-discovery.js.map +1 -0
- package/dist/lint/types.d.ts +72 -0
- package/dist/lint/types.d.ts.map +1 -0
- package/dist/lint/types.js +28 -0
- package/dist/lint/types.js.map +1 -0
- package/dist/output.d.ts +16 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +91 -0
- package/dist/output.js.map +1 -0
- package/dist/stores/resolver.d.ts +12 -0
- package/dist/stores/resolver.d.ts.map +1 -0
- package/dist/stores/resolver.js +54 -0
- package/dist/stores/resolver.js.map +1 -0
- package/dist/toon.d.ts +12 -0
- package/dist/toon.d.ts.map +1 -0
- package/dist/toon.js +27 -0
- package/dist/toon.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-bulk.d.ts","sourceRoot":"","sources":["../../src/commands/push-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAKxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAuBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CA6GnG"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, basename, extname } from 'node:path';
|
|
3
|
+
import { runPush } from './push.js';
|
|
4
|
+
import { formatSuccess, formatError, formatJson, formatWarning } from '../output.js';
|
|
5
|
+
export async function runPushBulk(dirPath, options) {
|
|
6
|
+
let entries;
|
|
7
|
+
try {
|
|
8
|
+
const stats = await stat(dirPath);
|
|
9
|
+
if (!stats.isDirectory()) {
|
|
10
|
+
return errorResult(`"${dirPath}" is not a directory.`, options.json);
|
|
11
|
+
}
|
|
12
|
+
entries = await readdir(dirPath);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
return errorResult(`Could not read directory "${dirPath}": ${err.message}`, options.json);
|
|
16
|
+
}
|
|
17
|
+
const jsonFiles = entries.filter((name) => extname(name) === '.json').sort();
|
|
18
|
+
if (jsonFiles.length === 0) {
|
|
19
|
+
return errorResult(`No *.json files found in "${dirPath}".`, options.json);
|
|
20
|
+
}
|
|
21
|
+
const results = [];
|
|
22
|
+
for (const filename of jsonFiles) {
|
|
23
|
+
const id = basename(filename, '.json');
|
|
24
|
+
const filePath = join(dirPath, filename);
|
|
25
|
+
let input;
|
|
26
|
+
try {
|
|
27
|
+
input = (await readFile(filePath, 'utf-8')).trim();
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
results.push({
|
|
31
|
+
id,
|
|
32
|
+
success: false,
|
|
33
|
+
errors: [{ message: `Could not read file: ${err.message}` }],
|
|
34
|
+
warnings: [],
|
|
35
|
+
elementCount: 0,
|
|
36
|
+
created: false,
|
|
37
|
+
});
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Force per-spec JSON to extract structured shape
|
|
41
|
+
const pushResult = await runPush(id, input, {
|
|
42
|
+
store: options.store,
|
|
43
|
+
json: true,
|
|
44
|
+
force: options.force,
|
|
45
|
+
author: options.author,
|
|
46
|
+
description: options.description,
|
|
47
|
+
});
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(pushResult.output);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
parsed = { success: false, errors: [{ message: 'Internal: failed to parse runPush output' }] };
|
|
54
|
+
}
|
|
55
|
+
// success+errors[] are validation errors saved-with-warnings (push.ts:91-93 path).
|
|
56
|
+
// success+warnings[] are prop warnings (push.ts:94 path, added in this Item).
|
|
57
|
+
// failure+errors[] are reject errors.
|
|
58
|
+
const errMessages = parsed.errors ?? [];
|
|
59
|
+
const warnMessages = parsed.warnings ?? [];
|
|
60
|
+
const validationAsWarnings = parsed.success === true ? errMessages : [];
|
|
61
|
+
const validationAsErrors = parsed.success === true ? [] : errMessages;
|
|
62
|
+
results.push({
|
|
63
|
+
id,
|
|
64
|
+
success: parsed.success === true,
|
|
65
|
+
errors: validationAsErrors,
|
|
66
|
+
warnings: [...validationAsWarnings, ...warnMessages],
|
|
67
|
+
elementCount: parsed.elementCount ?? 0,
|
|
68
|
+
created: parsed.created ?? false,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const summary = {
|
|
72
|
+
total: results.length,
|
|
73
|
+
saved: results.filter((r) => r.success).length,
|
|
74
|
+
rejected: results.filter((r) => !r.success).length,
|
|
75
|
+
warningsCount: results.filter((r) => r.warnings.length > 0).length,
|
|
76
|
+
};
|
|
77
|
+
const exitCode = summary.rejected > 0 ? 1 : 0;
|
|
78
|
+
if (options.json) {
|
|
79
|
+
const body = { summary, results };
|
|
80
|
+
return { output: formatJson(body), exitCode };
|
|
81
|
+
}
|
|
82
|
+
// Text output
|
|
83
|
+
const lines = [];
|
|
84
|
+
for (const r of results) {
|
|
85
|
+
if (r.success && r.warnings.length === 0) {
|
|
86
|
+
lines.push(formatSuccess(`${r.id} (${r.elementCount} elements, ${r.created ? 'new' : 'overwritten'})`));
|
|
87
|
+
}
|
|
88
|
+
else if (r.success && r.warnings.length > 0) {
|
|
89
|
+
lines.push(formatWarning(`${r.id} (${r.elementCount} elements, ${r.created ? 'new' : 'overwritten'}) — ${r.warnings.length} warning${r.warnings.length !== 1 ? 's' : ''}:`));
|
|
90
|
+
for (const w of r.warnings) {
|
|
91
|
+
lines.push(` ${w.path ?? ''}: ${w.message}`.trimStart());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
lines.push(formatError({ what: `${r.id} — ${r.errors.length} error${r.errors.length !== 1 ? 's' : ''}`, why: r.errors.map((e) => `${e.path ? e.path + ': ' : ''}${e.message}`).join('; ') }));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
lines.push('');
|
|
99
|
+
const summaryParts = [];
|
|
100
|
+
summaryParts.push(`${summary.saved} saved${summary.warningsCount > 0 ? ` (${summary.warningsCount} with warnings)` : ''}`);
|
|
101
|
+
if (summary.rejected > 0)
|
|
102
|
+
summaryParts.push(`${summary.rejected} rejected`);
|
|
103
|
+
lines.push(`${summary.total} specs processed: ${summaryParts.join(', ')}`);
|
|
104
|
+
return { output: lines.join('\n'), exitCode };
|
|
105
|
+
}
|
|
106
|
+
function errorResult(message, json) {
|
|
107
|
+
if (json) {
|
|
108
|
+
return { output: formatJson({ error: message }), exitCode: 1 };
|
|
109
|
+
}
|
|
110
|
+
return { output: formatError({ what: 'Bulk push failed', why: message }), exitCode: 1 };
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=push-bulk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-bulk.js","sourceRoot":"","sources":["../../src/commands/push-bulk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SpecStore, ValidationError } from 'mythik';
|
|
2
|
+
import type { CommandResult } from './manifest.js';
|
|
3
|
+
export interface PushOptions {
|
|
4
|
+
store: SpecStore;
|
|
5
|
+
json: boolean;
|
|
6
|
+
force: boolean;
|
|
7
|
+
author?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface PushResult {
|
|
11
|
+
success: boolean;
|
|
12
|
+
manifest: string;
|
|
13
|
+
errors?: ValidationError[];
|
|
14
|
+
warnings?: ValidationError[];
|
|
15
|
+
elementCount: number;
|
|
16
|
+
created: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function runPush(screenId: string, input: string, options: PushOptions): Promise<CommandResult>;
|
|
19
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAsB,MAAM,QAAQ,CAAC;AAI7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAsG3G"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { getDocumentHandler, PRIMITIVE_PROP_SCHEMAS } from 'mythik';
|
|
2
|
+
import { formatSuccess, formatError, formatJson, formatWarning, colorizeManifest, formatSuggestedFixes } from '../output.js';
|
|
3
|
+
import { autoparse } from '../toon.js';
|
|
4
|
+
export async function runPush(screenId, input, options) {
|
|
5
|
+
let doc;
|
|
6
|
+
try {
|
|
7
|
+
doc = autoparse(input);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
const message = 'Invalid spec input — must be valid JSON or TOON';
|
|
11
|
+
if (options.json) {
|
|
12
|
+
return { output: formatJson({ error: message }), exitCode: 1 };
|
|
13
|
+
}
|
|
14
|
+
return { output: formatError({ what: 'Parse error', why: message }), exitCode: 1 };
|
|
15
|
+
}
|
|
16
|
+
let handler;
|
|
17
|
+
try {
|
|
18
|
+
handler = getDocumentHandler(doc);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
const message = 'Unknown document type. Expected screen spec (root + elements) or app spec (type: "app").';
|
|
22
|
+
if (options.json) {
|
|
23
|
+
return { output: formatJson({ error: message }), exitCode: 1 };
|
|
24
|
+
}
|
|
25
|
+
return { output: formatError({ what: 'Invalid document', why: message }), exitCode: 1 };
|
|
26
|
+
}
|
|
27
|
+
let exists = false;
|
|
28
|
+
try {
|
|
29
|
+
const screens = await options.store.list();
|
|
30
|
+
exists = screens.includes(screenId);
|
|
31
|
+
}
|
|
32
|
+
catch { /* treat as new */ }
|
|
33
|
+
const validation = handler.validate(doc, { propSchemas: PRIMITIVE_PROP_SCHEMAS });
|
|
34
|
+
const elementCount = handler.countElements(doc);
|
|
35
|
+
let manifest = '';
|
|
36
|
+
try {
|
|
37
|
+
manifest = handler.generateManifest(doc);
|
|
38
|
+
}
|
|
39
|
+
catch { /* best effort */ }
|
|
40
|
+
const hasErrors = !validation.valid;
|
|
41
|
+
// Existing + invalid + no force → reject
|
|
42
|
+
if (hasErrors && exists && !options.force) {
|
|
43
|
+
const result = {
|
|
44
|
+
success: false, manifest, errors: validation.errors, elementCount, created: false,
|
|
45
|
+
};
|
|
46
|
+
if (options.json) {
|
|
47
|
+
return { output: formatJson(result), exitCode: 1 };
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
output: formatError({
|
|
51
|
+
what: `Rejected — "${screenId}" has ${validation.errors.length} validation error${validation.errors.length !== 1 ? 's' : ''}`,
|
|
52
|
+
why: formatSuggestedFixes(validation.errors, screenId),
|
|
53
|
+
fix: 'Fix the errors and re-push, or use --force to overwrite',
|
|
54
|
+
}),
|
|
55
|
+
exitCode: 1,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Save — use versioned save if store supports it and author is provided
|
|
59
|
+
const isVersioned = 'saveVersion' in options.store && typeof options.store.saveVersion === 'function';
|
|
60
|
+
if (isVersioned && options.author) {
|
|
61
|
+
await options.store.saveVersion(screenId, doc, {
|
|
62
|
+
author: options.author,
|
|
63
|
+
source: 'push',
|
|
64
|
+
description: options.description,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
await options.store.save(screenId, doc);
|
|
69
|
+
}
|
|
70
|
+
const created = !exists;
|
|
71
|
+
const result = {
|
|
72
|
+
success: true, manifest, elementCount, created,
|
|
73
|
+
...(hasErrors ? { errors: validation.errors } : {}),
|
|
74
|
+
...(validation.warnings?.length ? { warnings: validation.warnings } : {}),
|
|
75
|
+
};
|
|
76
|
+
if (options.json) {
|
|
77
|
+
return { output: formatJson(result), exitCode: 0 };
|
|
78
|
+
}
|
|
79
|
+
if (hasErrors) {
|
|
80
|
+
return {
|
|
81
|
+
output: [
|
|
82
|
+
formatWarning(`Saved "${screenId}" with ${validation.errors.length} validation error${validation.errors.length !== 1 ? 's' : ''} (${elementCount} elements, ${created ? 'new' : 'overwritten'})`),
|
|
83
|
+
'',
|
|
84
|
+
formatSuggestedFixes(validation.errors, screenId),
|
|
85
|
+
].join('\n'),
|
|
86
|
+
exitCode: 0,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const warningLines = validation.warnings?.length
|
|
90
|
+
? [formatWarning(`${validation.warnings.length} prop warning${validation.warnings.length !== 1 ? 's' : ''}:`), formatSuggestedFixes(validation.warnings, screenId), '']
|
|
91
|
+
: [];
|
|
92
|
+
return {
|
|
93
|
+
output: [
|
|
94
|
+
formatSuccess(`Saved "${screenId}" (${elementCount} elements, ${created ? 'new' : 'overwritten'})`),
|
|
95
|
+
'',
|
|
96
|
+
...warningLines,
|
|
97
|
+
colorizeManifest(manifest),
|
|
98
|
+
].join('\n'),
|
|
99
|
+
exitCode: 0,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { VersionedSpecStore, EnvironmentStore } from 'mythik';
|
|
2
|
+
import type { CommandResult } from './manifest.js';
|
|
3
|
+
export interface RollbackCommandOptions {
|
|
4
|
+
store: VersionedSpecStore;
|
|
5
|
+
envStore: EnvironmentStore;
|
|
6
|
+
toVersion: number;
|
|
7
|
+
confirm: boolean;
|
|
8
|
+
json: boolean;
|
|
9
|
+
author: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function runRollbackCommand(specId: string, options: RollbackCommandOptions): Promise<CommandResult>;
|
|
13
|
+
//# sourceMappingURL=rollback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAGnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkFhH"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { computeRollbackImpact, executeRollback } from 'mythik';
|
|
2
|
+
import { formatSuccess, formatError, formatJson } from '../output.js';
|
|
3
|
+
export async function runRollbackCommand(specId, options) {
|
|
4
|
+
try {
|
|
5
|
+
const currentVersion = await options.store.currentVersion(specId);
|
|
6
|
+
if (currentVersion === 0) {
|
|
7
|
+
return {
|
|
8
|
+
output: options.json
|
|
9
|
+
? formatJson({ error: `No version history for "${specId}"` })
|
|
10
|
+
: formatError({ what: 'No history', why: `Spec "${specId}" has no versions` }),
|
|
11
|
+
exitCode: 1,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const impact = await computeRollbackImpact({
|
|
15
|
+
specId,
|
|
16
|
+
fromVersion: currentVersion,
|
|
17
|
+
toVersion: options.toVersion,
|
|
18
|
+
store: options.store,
|
|
19
|
+
envStore: options.envStore,
|
|
20
|
+
});
|
|
21
|
+
if (!options.confirm) {
|
|
22
|
+
if (options.json) {
|
|
23
|
+
return { output: formatJson({ preview: true, fromVersion: currentVersion, toVersion: options.toVersion, impact }), exitCode: 0 };
|
|
24
|
+
}
|
|
25
|
+
const lines = [];
|
|
26
|
+
lines.push(`Rollback: ${specId} v${currentVersion} → v${options.toVersion}`);
|
|
27
|
+
lines.push('');
|
|
28
|
+
if (impact.lostChanges.length > 0) {
|
|
29
|
+
lines.push(' CHANGES THAT WILL BE LOST:');
|
|
30
|
+
for (const lc of impact.lostChanges) {
|
|
31
|
+
const icon = lc.change.kind.includes('added') ? '+' : lc.change.kind.includes('removed') ? '-' : '~';
|
|
32
|
+
lines.push(` ${icon} ${lc.change.detail} (${lc.author})`);
|
|
33
|
+
}
|
|
34
|
+
lines.push('');
|
|
35
|
+
}
|
|
36
|
+
if (impact.affectedEnvironments.length > 0) {
|
|
37
|
+
lines.push(' ENVIRONMENTS:');
|
|
38
|
+
for (const env of impact.affectedEnvironments) {
|
|
39
|
+
const status = env.affected ? 'affected' : 'not affected';
|
|
40
|
+
lines.push(` ${env.name}: v${env.currentVersion} → ${status}`);
|
|
41
|
+
}
|
|
42
|
+
lines.push('');
|
|
43
|
+
}
|
|
44
|
+
lines.push(' Preview only. Run with --confirm to execute.');
|
|
45
|
+
return { output: lines.join('\n'), exitCode: 0 };
|
|
46
|
+
}
|
|
47
|
+
const result = await executeRollback({
|
|
48
|
+
specId,
|
|
49
|
+
toVersion: options.toVersion,
|
|
50
|
+
store: options.store,
|
|
51
|
+
envStore: options.envStore,
|
|
52
|
+
author: options.author,
|
|
53
|
+
description: options.description,
|
|
54
|
+
});
|
|
55
|
+
if (!result.success) {
|
|
56
|
+
return {
|
|
57
|
+
output: options.json
|
|
58
|
+
? formatJson(result)
|
|
59
|
+
: formatError({ what: 'Rollback failed', why: result.errors?.[0]?.message ?? 'Unknown error' }),
|
|
60
|
+
exitCode: 1,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
output: options.json
|
|
65
|
+
? formatJson(result)
|
|
66
|
+
: formatSuccess(`Rolled back ${specId} v${result.fromVersion} → v${result.toVersion} (created v${result.newVersion})`),
|
|
67
|
+
exitCode: 0,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
const message = err.message;
|
|
72
|
+
return {
|
|
73
|
+
output: options.json ? formatJson({ error: message }) : formatError({ what: 'Rollback failed', why: message }),
|
|
74
|
+
exitCode: 1,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=rollback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CommandResult } from './manifest.js';
|
|
2
|
+
export interface TokensResolveOptions {
|
|
3
|
+
dna?: string;
|
|
4
|
+
tokens?: string;
|
|
5
|
+
json: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function runTokensResolve(options: TokensResolveOptions): Promise<CommandResult>;
|
|
8
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoE5F"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { resolveDeepTokens } from 'mythik';
|
|
2
|
+
import { formatSuccess, formatError, formatJson } from '../output.js';
|
|
3
|
+
export async function runTokensResolve(options) {
|
|
4
|
+
try {
|
|
5
|
+
let tokens;
|
|
6
|
+
if (options.dna) {
|
|
7
|
+
const dna = JSON.parse(options.dna);
|
|
8
|
+
tokens = { dna };
|
|
9
|
+
}
|
|
10
|
+
else if (options.tokens) {
|
|
11
|
+
tokens = JSON.parse(options.tokens);
|
|
12
|
+
}
|
|
13
|
+
const resolved = resolveDeepTokens(tokens);
|
|
14
|
+
// Remove modes and components for cleaner output
|
|
15
|
+
const output = { ...resolved };
|
|
16
|
+
delete output.modes;
|
|
17
|
+
delete output.components;
|
|
18
|
+
if (options.json) {
|
|
19
|
+
return { output: formatJson(output), exitCode: 0 };
|
|
20
|
+
}
|
|
21
|
+
// Pretty print sections
|
|
22
|
+
const lines = [];
|
|
23
|
+
const colors = output.colors;
|
|
24
|
+
lines.push(formatSuccess('Colors:'));
|
|
25
|
+
for (const [k, v] of Object.entries(colors)) {
|
|
26
|
+
lines.push(` ${k}: ${v}`);
|
|
27
|
+
}
|
|
28
|
+
const shape = output.shape;
|
|
29
|
+
lines.push('\n' + formatSuccess('Shape:'));
|
|
30
|
+
for (const [k, v] of Object.entries(shape.radius)) {
|
|
31
|
+
lines.push(` radius.${k}: ${v}`);
|
|
32
|
+
}
|
|
33
|
+
const typo = output.typography;
|
|
34
|
+
lines.push('\n' + formatSuccess('Typography:'));
|
|
35
|
+
const families = typo.fontFamily;
|
|
36
|
+
for (const [k, v] of Object.entries(families)) {
|
|
37
|
+
lines.push(` fontFamily.${k}: ${v}`);
|
|
38
|
+
}
|
|
39
|
+
const scale = typo.scale;
|
|
40
|
+
for (const [k, v] of Object.entries(scale)) {
|
|
41
|
+
lines.push(` scale.${k}: ${v.fontSize}/${v.lineHeight}`);
|
|
42
|
+
}
|
|
43
|
+
const spacing = output.spacing;
|
|
44
|
+
lines.push('\n' + formatSuccess('Spacing:'));
|
|
45
|
+
lines.push(` unit: ${spacing.unit}`);
|
|
46
|
+
for (const [k, v] of Object.entries(spacing.scale)) {
|
|
47
|
+
lines.push(` scale.${k}: ${v}`);
|
|
48
|
+
}
|
|
49
|
+
const motion = output.motion;
|
|
50
|
+
lines.push('\n' + formatSuccess('Motion:'));
|
|
51
|
+
for (const [k, v] of Object.entries(motion.duration)) {
|
|
52
|
+
lines.push(` duration.${k}: ${v}ms`);
|
|
53
|
+
}
|
|
54
|
+
for (const [k, v] of Object.entries(motion.easing)) {
|
|
55
|
+
lines.push(` easing.${k}: ${v}`);
|
|
56
|
+
}
|
|
57
|
+
return { output: lines.join('\n'), exitCode: 0 };
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
return { output: formatError({ what: 'Token resolution failed', why: err.message }), exitCode: 1 };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SpecStore } from 'mythik';
|
|
2
|
+
import type { CommandResult } from './manifest.js';
|
|
3
|
+
export interface ValidateOptions {
|
|
4
|
+
store: SpecStore;
|
|
5
|
+
json: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function runValidate(screenId: string, options: ValidateOptions): Promise<CommandResult>;
|
|
8
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAKnD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CA2DpG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getDocumentHandler, PRIMITIVE_PROP_SCHEMAS } from 'mythik';
|
|
2
|
+
import { formatSuccess, formatError, formatJson, formatWarning, formatSuggestedFixes } from '../output.js';
|
|
3
|
+
/** Primitives that accept className for CSS hover/active/focus. Matches mythik-react's CSS_HOVER_SUPPORTED. */
|
|
4
|
+
const CSS_HOVER_TYPES = new Set(['box', 'text', 'stack', 'grid', 'scroll', 'button', 'touchable', 'table']);
|
|
5
|
+
export async function runValidate(screenId, options) {
|
|
6
|
+
try {
|
|
7
|
+
const doc = await options.store.load(screenId);
|
|
8
|
+
const handler = getDocumentHandler(doc);
|
|
9
|
+
const elementCount = handler.countElements(doc);
|
|
10
|
+
const result = handler.validate(doc, { cssHoverTypes: CSS_HOVER_TYPES, propSchemas: PRIMITIVE_PROP_SCHEMAS });
|
|
11
|
+
// ApiSpec lintWarnings (additive field on SpecValidationResult — Item I)
|
|
12
|
+
const apiLintWarnings = result.lintWarnings;
|
|
13
|
+
const hasApiLintWarnings = Array.isArray(apiLintWarnings) && apiLintWarnings.length > 0;
|
|
14
|
+
if (options.json) {
|
|
15
|
+
return {
|
|
16
|
+
output: formatJson({
|
|
17
|
+
valid: result.valid,
|
|
18
|
+
elementCount,
|
|
19
|
+
errors: result.errors,
|
|
20
|
+
...(hasApiLintWarnings ? { lintWarnings: apiLintWarnings } : {}),
|
|
21
|
+
}),
|
|
22
|
+
exitCode: result.valid ? 0 : 1,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (result.valid) {
|
|
26
|
+
const warningLines = result.warnings?.length
|
|
27
|
+
? ['\n', formatWarning(`${result.warnings.length} prop warning${result.warnings.length !== 1 ? 's' : ''}:`), formatSuggestedFixes(result.warnings, screenId)]
|
|
28
|
+
: [];
|
|
29
|
+
const lintLines = hasApiLintWarnings
|
|
30
|
+
? ['\n', formatWarning(`${apiLintWarnings.length} lint warning${apiLintWarnings.length !== 1 ? 's' : ''}:`), formatSuggestedFixes(apiLintWarnings, screenId)]
|
|
31
|
+
: [];
|
|
32
|
+
return {
|
|
33
|
+
output: [formatSuccess(`Valid — ${elementCount} elements, 0 errors`), ...warningLines, ...lintLines].join('\n'),
|
|
34
|
+
exitCode: 0,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
output: formatError({
|
|
39
|
+
what: `Invalid — ${result.errors.length} error${result.errors.length !== 1 ? 's' : ''}`,
|
|
40
|
+
why: formatSuggestedFixes(result.errors, screenId),
|
|
41
|
+
}),
|
|
42
|
+
exitCode: 1,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const message = err.message;
|
|
47
|
+
if (options.json) {
|
|
48
|
+
return { output: formatJson({ error: message }), exitCode: 1 };
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
output: formatError({
|
|
52
|
+
what: `Screen "${screenId}" not found`,
|
|
53
|
+
why: message,
|
|
54
|
+
fix: 'Check the screen ID and try again',
|
|
55
|
+
}),
|
|
56
|
+
exitCode: 1,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface MythikConfig {
|
|
2
|
+
store: string;
|
|
3
|
+
supabase?: {
|
|
4
|
+
url: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
table?: string;
|
|
7
|
+
};
|
|
8
|
+
file?: {
|
|
9
|
+
dir: string;
|
|
10
|
+
};
|
|
11
|
+
sqlserver?: {
|
|
12
|
+
server: string;
|
|
13
|
+
database: string;
|
|
14
|
+
user?: string;
|
|
15
|
+
password?: string;
|
|
16
|
+
port?: number;
|
|
17
|
+
trustedConnection?: boolean;
|
|
18
|
+
table?: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface LoadConfigOptions {
|
|
22
|
+
cwd?: string;
|
|
23
|
+
flags?: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
export declare function loadConfig(options?: LoadConfigOptions): MythikConfig;
|
|
26
|
+
export declare function resolveEnvVars(config: MythikConfig): MythikConfig;
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,YAAY,CAsCxE;AAkDD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAkBjE"}
|