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.
Files changed (128) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +4 -0
  3. package/README.md +71 -0
  4. package/dist/api.d.ts +22 -0
  5. package/dist/api.d.ts.map +1 -0
  6. package/dist/api.js +17 -0
  7. package/dist/api.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +519 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/contract.d.ts +12 -0
  13. package/dist/commands/contract.d.ts.map +1 -0
  14. package/dist/commands/contract.js +133 -0
  15. package/dist/commands/contract.js.map +1 -0
  16. package/dist/commands/delete.d.ts +9 -0
  17. package/dist/commands/delete.d.ts.map +1 -0
  18. package/dist/commands/delete.js +46 -0
  19. package/dist/commands/delete.js.map +1 -0
  20. package/dist/commands/diff.d.ts +11 -0
  21. package/dist/commands/diff.d.ts.map +1 -0
  22. package/dist/commands/diff.js +49 -0
  23. package/dist/commands/diff.js.map +1 -0
  24. package/dist/commands/docs.d.ts +15 -0
  25. package/dist/commands/docs.d.ts.map +1 -0
  26. package/dist/commands/docs.js +117 -0
  27. package/dist/commands/docs.js.map +1 -0
  28. package/dist/commands/elements.d.ts +9 -0
  29. package/dist/commands/elements.d.ts.map +1 -0
  30. package/dist/commands/elements.js +48 -0
  31. package/dist/commands/elements.js.map +1 -0
  32. package/dist/commands/envs.d.ts +11 -0
  33. package/dist/commands/envs.d.ts.map +1 -0
  34. package/dist/commands/envs.js +54 -0
  35. package/dist/commands/envs.js.map +1 -0
  36. package/dist/commands/history.d.ts +10 -0
  37. package/dist/commands/history.d.ts.map +1 -0
  38. package/dist/commands/history.js +67 -0
  39. package/dist/commands/history.js.map +1 -0
  40. package/dist/commands/init.d.ts +9 -0
  41. package/dist/commands/init.d.ts.map +1 -0
  42. package/dist/commands/init.js +120 -0
  43. package/dist/commands/init.js.map +1 -0
  44. package/dist/commands/lint.d.ts +9 -0
  45. package/dist/commands/lint.d.ts.map +1 -0
  46. package/dist/commands/lint.js +15 -0
  47. package/dist/commands/lint.js.map +1 -0
  48. package/dist/commands/manifest.d.ts +11 -0
  49. package/dist/commands/manifest.d.ts.map +1 -0
  50. package/dist/commands/manifest.js +48 -0
  51. package/dist/commands/manifest.js.map +1 -0
  52. package/dist/commands/patch.d.ts +12 -0
  53. package/dist/commands/patch.d.ts.map +1 -0
  54. package/dist/commands/patch.js +103 -0
  55. package/dist/commands/patch.js.map +1 -0
  56. package/dist/commands/promote.d.ts +15 -0
  57. package/dist/commands/promote.d.ts.map +1 -0
  58. package/dist/commands/promote.js +83 -0
  59. package/dist/commands/promote.js.map +1 -0
  60. package/dist/commands/pull.d.ts +9 -0
  61. package/dist/commands/pull.d.ts.map +1 -0
  62. package/dist/commands/pull.js +36 -0
  63. package/dist/commands/pull.js.map +1 -0
  64. package/dist/commands/push-bulk.d.ts +11 -0
  65. package/dist/commands/push-bulk.d.ts.map +1 -0
  66. package/dist/commands/push-bulk.js +112 -0
  67. package/dist/commands/push-bulk.js.map +1 -0
  68. package/dist/commands/push.d.ts +19 -0
  69. package/dist/commands/push.d.ts.map +1 -0
  70. package/dist/commands/push.js +102 -0
  71. package/dist/commands/push.js.map +1 -0
  72. package/dist/commands/rollback.d.ts +13 -0
  73. package/dist/commands/rollback.d.ts.map +1 -0
  74. package/dist/commands/rollback.js +78 -0
  75. package/dist/commands/rollback.js.map +1 -0
  76. package/dist/commands/tokens.d.ts +8 -0
  77. package/dist/commands/tokens.d.ts.map +1 -0
  78. package/dist/commands/tokens.js +63 -0
  79. package/dist/commands/tokens.js.map +1 -0
  80. package/dist/commands/validate.d.ts +8 -0
  81. package/dist/commands/validate.d.ts.map +1 -0
  82. package/dist/commands/validate.js +60 -0
  83. package/dist/commands/validate.js.map +1 -0
  84. package/dist/config.d.ts +27 -0
  85. package/dist/config.d.ts.map +1 -0
  86. package/dist/config.js +112 -0
  87. package/dist/config.js.map +1 -0
  88. package/dist/input-resolver.d.ts +22 -0
  89. package/dist/input-resolver.d.ts.map +1 -0
  90. package/dist/input-resolver.js +55 -0
  91. package/dist/input-resolver.js.map +1 -0
  92. package/dist/levenshtein.d.ts +2 -0
  93. package/dist/levenshtein.d.ts.map +1 -0
  94. package/dist/levenshtein.js +2 -0
  95. package/dist/levenshtein.js.map +1 -0
  96. package/dist/lint/code-rules.d.ts +30 -0
  97. package/dist/lint/code-rules.d.ts.map +1 -0
  98. package/dist/lint/code-rules.js +81 -0
  99. package/dist/lint/code-rules.js.map +1 -0
  100. package/dist/lint/format.d.ts +12 -0
  101. package/dist/lint/format.d.ts.map +1 -0
  102. package/dist/lint/format.js +68 -0
  103. package/dist/lint/format.js.map +1 -0
  104. package/dist/lint/orchestrator.d.ts +17 -0
  105. package/dist/lint/orchestrator.d.ts.map +1 -0
  106. package/dist/lint/orchestrator.js +124 -0
  107. package/dist/lint/orchestrator.js.map +1 -0
  108. package/dist/lint/spec-discovery.d.ts +14 -0
  109. package/dist/lint/spec-discovery.d.ts.map +1 -0
  110. package/dist/lint/spec-discovery.js +72 -0
  111. package/dist/lint/spec-discovery.js.map +1 -0
  112. package/dist/lint/types.d.ts +72 -0
  113. package/dist/lint/types.d.ts.map +1 -0
  114. package/dist/lint/types.js +28 -0
  115. package/dist/lint/types.js.map +1 -0
  116. package/dist/output.d.ts +16 -0
  117. package/dist/output.d.ts.map +1 -0
  118. package/dist/output.js +91 -0
  119. package/dist/output.js.map +1 -0
  120. package/dist/stores/resolver.d.ts +12 -0
  121. package/dist/stores/resolver.d.ts.map +1 -0
  122. package/dist/stores/resolver.js +54 -0
  123. package/dist/stores/resolver.js.map +1 -0
  124. package/dist/toon.d.ts +12 -0
  125. package/dist/toon.d.ts.map +1 -0
  126. package/dist/toon.js +27 -0
  127. package/dist/toon.js.map +1 -0
  128. package/package.json +65 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Auto-discovery for `mythik lint` — finds spec files (`*.json`) and code
3
+ * files (`*.{ts,tsx,js,jsx}`) based on LintOptions.
4
+ *
5
+ * Resolution order:
6
+ * 1. Explicit `fromFile` flag → single file (filtered by extension)
7
+ * 2. Explicit `fromDir` flag → walk directory
8
+ * 3. No flags → spec auto-discovery via `.mythikrc` file store dir;
9
+ * code auto-discovery via `codeDir` (default './src')
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import { loadConfig } from '../config.js';
14
+ const CODE_EXT_PATTERN = /\.(tsx?|jsx?)$/;
15
+ // Excluded from recursive walks — runtime artifacts and VCS internals.
16
+ // Prevents UX footgun when running `mythik lint --from-dir .` from project root.
17
+ const EXCLUDED_DIRS = new Set(['node_modules', 'dist', '.next', 'build', '.git']);
18
+ function walkDir(dir) {
19
+ if (!fs.existsSync(dir))
20
+ return [];
21
+ const out = [];
22
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
23
+ for (const entry of entries) {
24
+ if (entry.isDirectory() && EXCLUDED_DIRS.has(entry.name))
25
+ continue;
26
+ const full = path.join(dir, entry.name);
27
+ if (entry.isDirectory()) {
28
+ out.push(...walkDir(full));
29
+ }
30
+ else if (entry.isFile()) {
31
+ out.push(full);
32
+ }
33
+ }
34
+ return out;
35
+ }
36
+ export async function discoverSpecs(opts) {
37
+ if (opts.fromFile) {
38
+ return opts.fromFile.endsWith('.json') ? [opts.fromFile] : [];
39
+ }
40
+ if (opts.fromDir) {
41
+ return walkDir(opts.fromDir).filter(p => p.endsWith('.json'));
42
+ }
43
+ // No args: try .mythikrc file store
44
+ try {
45
+ const config = loadConfig({ cwd: opts.cwd });
46
+ if (config.store === 'file' && config.file?.dir) {
47
+ const cwd = opts.cwd ?? process.cwd();
48
+ const specsDir = path.isAbsolute(config.file.dir) ? config.file.dir : path.resolve(cwd, config.file.dir);
49
+ return walkDir(specsDir).filter(p => p.endsWith('.json'));
50
+ }
51
+ }
52
+ catch {
53
+ // No config or non-file store
54
+ }
55
+ return [];
56
+ }
57
+ export async function discoverCode(opts) {
58
+ if (opts.fromFile) {
59
+ return CODE_EXT_PATTERN.test(opts.fromFile) ? [opts.fromFile] : [];
60
+ }
61
+ if (opts.fromDir) {
62
+ return walkDir(opts.fromDir).filter(p => CODE_EXT_PATTERN.test(p));
63
+ }
64
+ // No args: scan opts.codeDir or default './src'
65
+ const cwd = opts.cwd ?? process.cwd();
66
+ const codeDirRel = opts.codeDir ?? './src';
67
+ const codeDir = path.isAbsolute(codeDirRel) ? codeDirRel : path.resolve(cwd, codeDirRel);
68
+ if (!fs.existsSync(codeDir))
69
+ return [];
70
+ return walkDir(codeDir).filter(p => CODE_EXT_PATTERN.test(p));
71
+ }
72
+ //# sourceMappingURL=spec-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-discovery.js","sourceRoot":"","sources":["../../src/lint/spec-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Type definitions for `mythik lint` command and `runLint` programmatic API.
3
+ *
4
+ * Bridge: `ValidationError` (from `mythik` spec-validator) is converted
5
+ * to `LintFinding` by the orchestrator. Spec rules emit ValidationError with
6
+ * `ruleId` set; orchestrator uses `ruleId !== undefined` to filter lint
7
+ * findings from other validator output.
8
+ */
9
+ import type { JsonPatch, ValidationError } from 'mythik';
10
+ export type LintSeverity = 'error' | 'warning';
11
+ export interface LintLocation {
12
+ /** JSON Pointer path (RFC 6901) — populated for spec findings. */
13
+ jsonPath?: string;
14
+ /** Source line (1-based) — populated for code findings. */
15
+ line?: number;
16
+ /** Source column (0-based) — populated for code findings. */
17
+ column?: number;
18
+ }
19
+ export type LintSuggestion = {
20
+ type: 'json-patch';
21
+ patch: JsonPatch;
22
+ description: string;
23
+ } | {
24
+ type: 'code-snippet';
25
+ before: string;
26
+ after: string;
27
+ explanation: string;
28
+ };
29
+ export interface LintFinding {
30
+ /** Relative file path from cwd. */
31
+ file: string;
32
+ /** Lint rule identifier (e.g. 'spec-row-literal', 'code-store-save-bypass'). */
33
+ ruleId: string;
34
+ severity: LintSeverity;
35
+ message: string;
36
+ location: LintLocation;
37
+ suggestedFix?: LintSuggestion;
38
+ /** Reference doc anchor (e.g. 'reference-doc.md#rule-249'). */
39
+ docRef?: string;
40
+ }
41
+ export interface LintSummary {
42
+ errors: number;
43
+ warnings: number;
44
+ files: number;
45
+ scopes: Array<'specs' | 'code'>;
46
+ }
47
+ export interface LintResult {
48
+ findings: LintFinding[];
49
+ summary: LintSummary;
50
+ }
51
+ export interface LintOptions {
52
+ /** Lint single file (auto-detect by extension). */
53
+ fromFile?: string;
54
+ /** Lint all matching files in folder (recursive). */
55
+ fromDir?: string;
56
+ /** Skip code rules (e.g. when TS not installed). */
57
+ specsOnly?: boolean;
58
+ /** Skip spec rules. */
59
+ codeOnly?: boolean;
60
+ /** Code scan root (default: ./src). */
61
+ codeDir?: string;
62
+ /** JSON output mode. */
63
+ json?: boolean;
64
+ /** Working directory for path resolution + .mythikrc lookup. Defaults to process.cwd(). */
65
+ cwd?: string;
66
+ }
67
+ /**
68
+ * Internal helper — converts `ValidationError` (from validator) to `LintFinding`.
69
+ * Keeps orchestrator logic clean by centralizing the bridge.
70
+ */
71
+ export declare function validationErrorToLintFinding(err: ValidationError, file: string, severity: LintSeverity, docRef?: string): LintFinding;
72
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lint/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEN,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2FAA2F;IAC3F,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EACtB,MAAM,SAA8B,GACnC,WAAW,CAcb"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Type definitions for `mythik lint` command and `runLint` programmatic API.
3
+ *
4
+ * Bridge: `ValidationError` (from `mythik` spec-validator) is converted
5
+ * to `LintFinding` by the orchestrator. Spec rules emit ValidationError with
6
+ * `ruleId` set; orchestrator uses `ruleId !== undefined` to filter lint
7
+ * findings from other validator output.
8
+ */
9
+ /**
10
+ * Internal helper — converts `ValidationError` (from validator) to `LintFinding`.
11
+ * Keeps orchestrator logic clean by centralizing the bridge.
12
+ */
13
+ export function validationErrorToLintFinding(err, file, severity, docRef = 'reference-doc.md#rule-249') {
14
+ const fix = err.suggestedFixes?.[0];
15
+ const suggestedFix = fix
16
+ ? { type: 'json-patch', patch: fix.patch, description: fix.description }
17
+ : undefined;
18
+ return {
19
+ file,
20
+ ruleId: err.ruleId ?? 'unknown',
21
+ severity,
22
+ message: err.message,
23
+ location: { jsonPath: err.path },
24
+ suggestedFix,
25
+ docRef,
26
+ };
27
+ }
28
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lint/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsEH;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,GAAoB,EACpB,IAAY,EACZ,QAAsB,EACtB,MAAM,GAAG,2BAA2B;IAEpC,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,YAAY,GAA+B,GAAG;QAClD,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;QACxE,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;QAC/B,QAAQ;QACR,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE;QAChC,YAAY;QACZ,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare function formatSuccess(message: string): string;
2
+ export interface ErrorParts {
3
+ what: string;
4
+ why: string;
5
+ fix?: string;
6
+ }
7
+ export declare function formatError(parts: ErrorParts): string;
8
+ export declare function formatJson(data: unknown): string;
9
+ export declare function formatJsonPretty(data: unknown): string;
10
+ export declare function formatElementHeader(id: string, type: string): string;
11
+ export declare function formatWarning(message: string): string;
12
+ export declare function colorizeManifest(manifest: string): string;
13
+ export declare function stripAnsi(str: string): string;
14
+ import type { ValidationError } from 'mythik';
15
+ export declare function formatSuggestedFixes(errors: ValidationError[], screenId?: string): string;
16
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAQA,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAUrD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqCzD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBzF"}
package/dist/output.js ADDED
@@ -0,0 +1,91 @@
1
+ const GREEN = '\x1b[32m';
2
+ const RED = '\x1b[31m';
3
+ const YELLOW = '\x1b[33m';
4
+ const CYAN = '\x1b[36m';
5
+ const DIM = '\x1b[2m';
6
+ const BOLD = '\x1b[1m';
7
+ const RESET = '\x1b[0m';
8
+ export function formatSuccess(message) {
9
+ return `${GREEN}✓${RESET} ${BOLD}${message}${RESET}`;
10
+ }
11
+ export function formatError(parts) {
12
+ const lines = [];
13
+ lines.push(`${RED}✗${RESET} ${BOLD}${parts.what}${RESET}`);
14
+ lines.push('');
15
+ lines.push(` ${parts.why}`);
16
+ if (parts.fix) {
17
+ lines.push('');
18
+ lines.push(` ${CYAN}Fix:${RESET} ${parts.fix}`);
19
+ }
20
+ return lines.join('\n');
21
+ }
22
+ export function formatJson(data) {
23
+ return JSON.stringify(data);
24
+ }
25
+ export function formatJsonPretty(data) {
26
+ return JSON.stringify(data, null, 2);
27
+ }
28
+ export function formatElementHeader(id, type) {
29
+ const header = `${BOLD}${id}${RESET} ${DIM}(${type})${RESET}`;
30
+ const line = `${DIM}${'─'.repeat(id.length + type.length + 3)}${RESET}`;
31
+ return `${header}\n${line}`;
32
+ }
33
+ export function formatWarning(message) {
34
+ return `${YELLOW}⚠${RESET} ${message}`;
35
+ }
36
+ export function colorizeManifest(manifest) {
37
+ return manifest
38
+ .split('\n')
39
+ .map(line => {
40
+ // Tree characters → dim
41
+ line = line.replace(/([├└│─]+──\s)/g, `${DIM}$1${RESET}`);
42
+ // "app: name (N screens, M locales)" header
43
+ line = line.replace(/^(app:\s+)(.*)(\s+\(\d+.*)/, `${BOLD}$1$2$3${RESET}`);
44
+ // "root: id (type)" line
45
+ line = line.replace(/^(root:\s+)(\S+)(\s+\()(\w[\w-]*)(\))/, `$1${BOLD}$2${RESET}$3${DIM}$4${RESET}$5`);
46
+ // "screen: id (N elements)" header
47
+ line = line.replace(/^(screen:\s+)(\S+)(\s+\(\d+ elements\))/, `${BOLD}$1$2$3${RESET}`);
48
+ // Section headers: navigation:, auth:, tokens:, translations:, sharedState:, templates:, layout:, screens:
49
+ line = line.replace(/^(navigation:|auth:|tokens:|translations:|sharedState:|templates:|layout:|screens:)(.*)/, `${CYAN}$1${RESET}$2`);
50
+ // Warning markers
51
+ line = line.replace(/(⚠[^)]*)/g, `${YELLOW}$1${RESET}`);
52
+ // "initialActions:" line
53
+ line = line.replace(/^(initialActions:\s+)(.*)/, `${DIM}$1${CYAN}$2${RESET}`);
54
+ // Element lines: "id (type) → annotations"
55
+ line = line.replace(/(\s)(\S+)(\s+\()(\w[\w-]*)(\))(\s*→\s*)?(.*)$/, (_, space, id, paren, type, closeParen, arrow, annotations) => {
56
+ let result = `${space}${BOLD}${id}${RESET}${paren}${DIM}${type}${RESET}${closeParen}`;
57
+ if (arrow && annotations) {
58
+ result += `${DIM} → ${YELLOW}${annotations}${RESET}`;
59
+ }
60
+ return result;
61
+ });
62
+ return line;
63
+ })
64
+ .join('\n');
65
+ }
66
+ export function stripAnsi(str) {
67
+ return str.replace(/\x1b\[[0-9;]*m/g, '');
68
+ }
69
+ export function formatSuggestedFixes(errors, screenId) {
70
+ const lines = [];
71
+ const fixable = [];
72
+ for (const error of errors) {
73
+ lines.push(` ${RED}✗${RESET} ${error.message}`);
74
+ if (error.suggestedFixes && error.suggestedFixes.length > 0) {
75
+ for (const fix of error.suggestedFixes) {
76
+ lines.push(` ${CYAN}→${RESET} Fix: ${JSON.stringify(fix.patch)}`);
77
+ fixable.push(JSON.stringify(fix.patch));
78
+ }
79
+ }
80
+ else if (error.path) {
81
+ lines.push(` ${DIM}→ Path: ${error.path} (manual fix needed)${RESET}`);
82
+ }
83
+ }
84
+ if (fixable.length > 0 && screenId) {
85
+ lines.push('');
86
+ lines.push(`Auto-fix all (${fixable.length}/${errors.length}):`);
87
+ lines.push(` mythik patch ${screenId} '[${fixable.join(',')}]'`);
88
+ }
89
+ return lines.join('\n');
90
+ }
91
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,GAAG,KAAK,IAAI,KAAK,IAAI,IAAI,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;AACvD,CAAC;AAQD,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAU,EAAE,IAAY;IAC1D,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;IAC9D,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;IACxE,OAAO,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,GAAG,MAAM,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ;SACZ,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,wBAAwB;QACxB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;QAE1D,4CAA4C;QAC5C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,GAAG,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC;QAE3E,yBAAyB;QACzB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uCAAuC,EAAE,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC;QAExG,mCAAmC;QACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yCAAyC,EAAE,GAAG,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC;QAExF,2GAA2G;QAC3G,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yFAAyF,EAAE,GAAG,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;QAEtI,kBAAkB;QAClB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;QAExD,yBAAyB;QACzB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,GAAG,GAAG,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;QAE9E,2CAA2C;QAC3C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,+CAA+C,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YACjI,IAAI,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,UAAU,EAAE,CAAC;YACtF,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,GAAG,MAAM,MAAM,GAAG,WAAW,GAAG,KAAK,EAAE,CAAC;YACvD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAID,MAAM,UAAU,oBAAoB,CAAC,MAAyB,EAAE,QAAiB;IAC/E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,WAAW,KAAK,CAAC,IAAI,uBAAuB,KAAK,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,kBAAkB,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SpecStore, VersionedSpecStore, EnvironmentStore } from 'mythik';
2
+ import type { MythikConfig } from '../config.js';
3
+ export declare function resolveStore(config: MythikConfig): SpecStore;
4
+ /**
5
+ * Resolve a VersionedSpecStore + EnvironmentStore from config.
6
+ * Currently only memory store has a versioned implementation.
7
+ */
8
+ export declare function resolveVersionedStore(config: MythikConfig): {
9
+ store: VersionedSpecStore;
10
+ envStore: EnvironmentStore;
11
+ };
12
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/stores/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAyB5D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CA+BrH"}
@@ -0,0 +1,54 @@
1
+ import { MemorySpecStore, SupabaseSpecStore, MemoryVersionedSpecStore, MemoryEnvironmentStore, SupabaseVersionedSpecStore, SupabaseEnvironmentStore } from 'mythik';
2
+ import { FileSpecStore, SqlServerSpecStore, SqlServerVersionedSpecStore, SqlServerEnvironmentStore } from 'mythik/server';
3
+ export function resolveStore(config) {
4
+ switch (config.store) {
5
+ case 'supabase':
6
+ if (!config.supabase?.url || !config.supabase?.apiKey) {
7
+ throw new Error('Supabase config requires "url" and "apiKey"');
8
+ }
9
+ return new SupabaseSpecStore(config.supabase);
10
+ case 'sqlserver':
11
+ if (!config.sqlserver?.server || !config.sqlserver?.database) {
12
+ throw new Error('SQL Server config requires "server" and "database"');
13
+ }
14
+ return new SqlServerSpecStore(config.sqlserver);
15
+ case 'file':
16
+ return new FileSpecStore({ directory: config.file?.dir ?? './specs' });
17
+ case 'memory':
18
+ return new MemorySpecStore();
19
+ default:
20
+ throw new Error(`Unknown store: "${config.store}". Available: supabase, sqlserver, file, memory`);
21
+ }
22
+ }
23
+ /**
24
+ * Resolve a VersionedSpecStore + EnvironmentStore from config.
25
+ * Currently only memory store has a versioned implementation.
26
+ */
27
+ export function resolveVersionedStore(config) {
28
+ if (config.store === 'memory') {
29
+ const store = new MemoryVersionedSpecStore();
30
+ const envStore = new MemoryEnvironmentStore();
31
+ return { store, envStore };
32
+ }
33
+ if (config.store === 'sqlserver') {
34
+ if (!config.sqlserver?.server || !config.sqlserver?.database) {
35
+ throw new Error('SQL Server config requires "server" and "database"');
36
+ }
37
+ const store = new SqlServerVersionedSpecStore(config.sqlserver);
38
+ // Environment store uses its own fixed table — don't pass the --table override
39
+ const { table: _, ...envConfig } = config.sqlserver;
40
+ const envStore = new SqlServerEnvironmentStore(envConfig);
41
+ return { store, envStore };
42
+ }
43
+ if (config.store === 'supabase') {
44
+ if (!config.supabase?.url || !config.supabase?.apiKey) {
45
+ throw new Error('Supabase config requires "url" and "apiKey"');
46
+ }
47
+ const store = new SupabaseVersionedSpecStore(config.supabase);
48
+ const { table: _, ...envConfig } = config.supabase;
49
+ const envStore = new SupabaseEnvironmentStore(envConfig);
50
+ return { store, envStore };
51
+ }
52
+ throw new Error(`Versioned store not yet available for "${config.store}". Currently supported: memory, sqlserver, supabase.`);
53
+ }
54
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/stores/resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AACpK,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1H,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,UAAU;YACb,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhD,KAAK,WAAW;YACd,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;gBAC7D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAElD,KAAK,MAAM;YACT,OAAO,IAAI,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;QAEzE,KAAK,QAAQ;YACX,OAAO,IAAI,eAAe,EAAE,CAAC;QAE/B;YACE,MAAM,IAAI,KAAK,CACb,mBAAmB,MAAM,CAAC,KAAK,iDAAiD,CACjF,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,wBAAwB,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,2BAA2B,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChE,+EAA+E;QAC/E,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;QAC1D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,0BAA0B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,wBAAwB,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,IAAI,KAAK,CACb,0CAA0C,MAAM,CAAC,KAAK,sDAAsD,CAC7G,CAAC;AACJ,CAAC"}
package/dist/toon.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ /** Encode a JSON-serializable value to TOON format. */
2
+ export declare function toToon(value: unknown): string;
3
+ /** Decode a TOON string to a JSON value. */
4
+ export declare function fromToon(input: string): unknown;
5
+ /**
6
+ * Autodetect format and parse.
7
+ * Tries JSON.parse first — if it succeeds, it's JSON.
8
+ * If JSON.parse fails, tries TOON decode.
9
+ * This handles edge cases where TOON tabular arrays start with `{` (column headers).
10
+ */
11
+ export declare function autoparse(input: string): unknown;
12
+ //# sourceMappingURL=toon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toon.d.ts","sourceRoot":"","sources":["../src/toon.ts"],"names":[],"mappings":"AAKA,uDAAuD;AACvD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOhD"}
package/dist/toon.js ADDED
@@ -0,0 +1,27 @@
1
+ import { encode, decode } from '@toon-format/toon';
2
+ const ENCODE_OPTIONS = { keyFolding: 'safe' };
3
+ const DECODE_OPTIONS = { expandPaths: 'safe' };
4
+ /** Encode a JSON-serializable value to TOON format. */
5
+ export function toToon(value) {
6
+ return encode(value, ENCODE_OPTIONS);
7
+ }
8
+ /** Decode a TOON string to a JSON value. */
9
+ export function fromToon(input) {
10
+ return decode(input, DECODE_OPTIONS);
11
+ }
12
+ /**
13
+ * Autodetect format and parse.
14
+ * Tries JSON.parse first — if it succeeds, it's JSON.
15
+ * If JSON.parse fails, tries TOON decode.
16
+ * This handles edge cases where TOON tabular arrays start with `{` (column headers).
17
+ */
18
+ export function autoparse(input) {
19
+ const trimmed = input.trim();
20
+ try {
21
+ return JSON.parse(trimmed);
22
+ }
23
+ catch {
24
+ return fromToon(trimmed);
25
+ }
26
+ }
27
+ //# sourceMappingURL=toon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toon.js","sourceRoot":"","sources":["../src/toon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,cAAc,GAAG,EAAE,UAAU,EAAE,MAAe,EAAE,CAAC;AACvD,MAAM,cAAc,GAAG,EAAE,WAAW,EAAE,MAAe,EAAE,CAAC;AAExD,uDAAuD;AACvD,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,MAAM,CAAC,KAA8C,EAAE,cAAc,CAAC,CAAC;AAChF,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "mythik-cli",
3
+ "version": "0.1.0",
4
+ "description": "Command-line and programmatic tooling for validating, linting, pushing, patching, and versioning Mythik specs.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "bin": {
8
+ "mythik": "dist/cli.js"
9
+ },
10
+ "main": "dist/cli.js",
11
+ "keywords": [
12
+ "mythik",
13
+ "cli",
14
+ "json",
15
+ "spec-driven",
16
+ "validation",
17
+ "lint",
18
+ "ai"
19
+ ],
20
+ "homepage": "https://mythik.dev",
21
+ "bugs": {
22
+ "url": "https://github.com/mldixdev/mythik/issues"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/mldixdev/mythik.git",
27
+ "directory": "packages/cli"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "LICENSE",
32
+ "NOTICE"
33
+ ],
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/cli.d.ts",
37
+ "default": "./dist/cli.js"
38
+ },
39
+ "./api": {
40
+ "types": "./dist/api.d.ts",
41
+ "default": "./dist/api.js"
42
+ },
43
+ "./package.json": "./package.json"
44
+ },
45
+ "scripts": {
46
+ "build": "node ../../node_modules/typescript/bin/tsc",
47
+ "typecheck": "node ../../node_modules/typescript/bin/tsc --noEmit",
48
+ "prepack": "pnpm build"
49
+ },
50
+ "dependencies": {
51
+ "@inquirer/prompts": "^7.0.0",
52
+ "mythik": "workspace:*",
53
+ "@toon-format/toon": "^2.1.0",
54
+ "commander": "^13.0.0"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^25.5.2"
58
+ },
59
+ "peerDependencies": {
60
+ "typescript": ">=5.0.0"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "typescript": { "optional": true }
64
+ }
65
+ }