@devarings/fabric-cli 0.2.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 (61) hide show
  1. package/dist/bin/fabric.d.ts +3 -0
  2. package/dist/bin/fabric.d.ts.map +1 -0
  3. package/dist/bin/fabric.js +118 -0
  4. package/dist/bin/fabric.js.map +1 -0
  5. package/dist/src/commands/check.d.ts +6 -0
  6. package/dist/src/commands/check.d.ts.map +1 -0
  7. package/dist/src/commands/check.js +26 -0
  8. package/dist/src/commands/check.js.map +1 -0
  9. package/dist/src/commands/compile.d.ts +2 -0
  10. package/dist/src/commands/compile.d.ts.map +1 -0
  11. package/dist/src/commands/compile.js +36 -0
  12. package/dist/src/commands/compile.js.map +1 -0
  13. package/dist/src/commands/create.d.ts +19 -0
  14. package/dist/src/commands/create.d.ts.map +1 -0
  15. package/dist/src/commands/create.js +114 -0
  16. package/dist/src/commands/create.js.map +1 -0
  17. package/dist/src/commands/diff.d.ts +6 -0
  18. package/dist/src/commands/diff.d.ts.map +1 -0
  19. package/dist/src/commands/diff.js +73 -0
  20. package/dist/src/commands/diff.js.map +1 -0
  21. package/dist/src/commands/health.d.ts +6 -0
  22. package/dist/src/commands/health.d.ts.map +1 -0
  23. package/dist/src/commands/health.js +27 -0
  24. package/dist/src/commands/health.js.map +1 -0
  25. package/dist/src/commands/init.d.ts +4 -0
  26. package/dist/src/commands/init.d.ts.map +1 -0
  27. package/dist/src/commands/init.js +29 -0
  28. package/dist/src/commands/init.js.map +1 -0
  29. package/dist/src/commands/install.d.ts +2 -0
  30. package/dist/src/commands/install.d.ts.map +1 -0
  31. package/dist/src/commands/install.js +48 -0
  32. package/dist/src/commands/install.js.map +1 -0
  33. package/dist/src/commands/lint.d.ts +2 -0
  34. package/dist/src/commands/lint.d.ts.map +1 -0
  35. package/dist/src/commands/lint.js +29 -0
  36. package/dist/src/commands/lint.js.map +1 -0
  37. package/dist/src/commands/publish.d.ts +2 -0
  38. package/dist/src/commands/publish.d.ts.map +1 -0
  39. package/dist/src/commands/publish.js +66 -0
  40. package/dist/src/commands/publish.js.map +1 -0
  41. package/dist/src/commands/replay.d.ts +7 -0
  42. package/dist/src/commands/replay.d.ts.map +1 -0
  43. package/dist/src/commands/replay.js +57 -0
  44. package/dist/src/commands/replay.js.map +1 -0
  45. package/dist/src/commands/watch.d.ts +2 -0
  46. package/dist/src/commands/watch.d.ts.map +1 -0
  47. package/dist/src/commands/watch.js +61 -0
  48. package/dist/src/commands/watch.js.map +1 -0
  49. package/dist/src/discover.d.ts +3 -0
  50. package/dist/src/discover.d.ts.map +1 -0
  51. package/dist/src/discover.js +3 -0
  52. package/dist/src/discover.js.map +1 -0
  53. package/dist/src/formatter.d.ts +5 -0
  54. package/dist/src/formatter.d.ts.map +1 -0
  55. package/dist/src/formatter.js +106 -0
  56. package/dist/src/formatter.js.map +1 -0
  57. package/dist/src/index.d.ts +3 -0
  58. package/dist/src/index.d.ts.map +1 -0
  59. package/dist/src/index.js +3 -0
  60. package/dist/src/index.js.map +1 -0
  61. package/package.json +48 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=fabric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fabric.d.ts","sourceRoot":"","sources":["../../bin/fabric.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ import { resolve } from 'node:path';
3
+ import { Command } from 'commander';
4
+ import { check } from '../src/commands/check.js';
5
+ import { compile } from '../src/commands/compile.js';
6
+ import { create } from '../src/commands/create.js';
7
+ import { diff } from '../src/commands/diff.js';
8
+ import { health } from '../src/commands/health.js';
9
+ import { init } from '../src/commands/init.js';
10
+ import { install } from '../src/commands/install.js';
11
+ import { lint } from '../src/commands/lint.js';
12
+ import { publish } from '../src/commands/publish.js';
13
+ import { replay } from '../src/commands/replay.js';
14
+ import { watchFabric } from '../src/commands/watch.js';
15
+ const program = new Command();
16
+ program
17
+ .name('dvs-fabric')
18
+ .description('Fabric CLI — validate, create, compile, and inspect knowledge fabrics')
19
+ .version('0.1.0');
20
+ program
21
+ .command('check')
22
+ .description('Validate all atoms in the fabric (L1 + L2 + L3 + compile)')
23
+ .argument('[path]', 'path to the fabric root', '.')
24
+ .option('--json', 'output as JSON')
25
+ .action((path, options) => {
26
+ check(resolve(path), options).catch(fatal);
27
+ });
28
+ program
29
+ .command('create')
30
+ .description('Create a new atom or topic from a type template')
31
+ .argument('<type>', 'atom type or "topic" for full topic scaffolding')
32
+ .requiredOption('-d, --domain <domain>', 'domain name')
33
+ .requiredOption('-t, --topic <topic>', 'topic name')
34
+ .option('-i, --id <id>', 'atom id (required for single atoms, auto-generated for topics)')
35
+ .action((typeName, options) => {
36
+ create(typeName, options);
37
+ });
38
+ program
39
+ .command('compile')
40
+ .description('Compile all contract atoms (TypeScript, SQL)')
41
+ .argument('[path]', 'path to the fabric root', '.')
42
+ .action((path) => {
43
+ compile(resolve(path)).catch(fatal);
44
+ });
45
+ program
46
+ .command('health')
47
+ .description('Show detailed health report (inventory, diagnostics, coverage)')
48
+ .argument('[path]', 'path to the fabric root', '.')
49
+ .option('--json', 'output as JSON')
50
+ .action((path, options) => {
51
+ health(resolve(path), options).catch(fatal);
52
+ });
53
+ program
54
+ .command('replay')
55
+ .description('Replay scenarios against state machines and check transition coverage')
56
+ .argument('[path]', 'path to the fabric root', '.')
57
+ .option('--topic <topic>', 'filter by topic name')
58
+ .option('--verbose', 'show each transition step')
59
+ .action((path, options) => {
60
+ replay(resolve(path), options).catch(fatal);
61
+ });
62
+ program
63
+ .command('init')
64
+ .description('Initialize a fabric in the current directory')
65
+ .argument('[path]', 'directory to initialize', '.')
66
+ .option('--template <template>', 'template to use (blank or starter)', 'blank')
67
+ .action((path, options) => {
68
+ init(resolve(path), options);
69
+ });
70
+ program
71
+ .command('lint')
72
+ .description('Lint source code for convention violations (magic strings, etc.)')
73
+ .argument('[path]', 'path to the repo root', '.')
74
+ .action((path) => {
75
+ lint(resolve(path));
76
+ });
77
+ program
78
+ .command('watch')
79
+ .description('Watch fabric for changes and validate in real-time')
80
+ .argument('[path]', 'path to the fabric root', '.')
81
+ .action((path) => {
82
+ watchFabric(resolve(path)).catch(fatal);
83
+ });
84
+ program
85
+ .command('diff')
86
+ .description('Show fabric-aware diff between git refs')
87
+ .argument('[path]', 'path to the fabric root', '.')
88
+ .option('--ref <ref>', 'git ref to compare against', 'HEAD')
89
+ .action((path, options) => {
90
+ diff(resolve(path), options);
91
+ });
92
+ program
93
+ .command('install')
94
+ .description('Install a fabric package from a local path')
95
+ .argument('<source>', 'path to the package directory')
96
+ .action((source) => {
97
+ install(source);
98
+ });
99
+ program
100
+ .command('publish')
101
+ .description('Validate package for publishing (dry-run only)')
102
+ .argument('[path]', 'path to the package root', '.')
103
+ .action((path) => {
104
+ publish(resolve(path)).catch(fatal);
105
+ });
106
+ // Default to check if no command given
107
+ program
108
+ .argument('[path]', 'path to the fabric root (shorthand for "check")')
109
+ .option('--json', 'output as JSON')
110
+ .action((path, options) => {
111
+ check(resolve(path ?? '.'), options).catch(fatal);
112
+ });
113
+ program.parse();
114
+ function fatal(err) {
115
+ console.error('Fatal error:', err);
116
+ process.exit(2);
117
+ }
118
+ //# sourceMappingURL=fabric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fabric.js","sourceRoot":"","sources":["../../bin/fabric.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface CheckOptions {
2
+ json?: true | undefined;
3
+ }
4
+ export declare function check(path: string, options: CheckOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/commands/check.ts"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;CACxB;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB9E"}
@@ -0,0 +1,26 @@
1
+ import { findConfigFile, loadConfig, parse, resolveTypes, validate } from '@devarings/fabric-core';
2
+ import { discoverAtoms } from '../discover.js';
3
+ import { formatJson, formatText } from '../formatter.js';
4
+ export async function check(path, options) {
5
+ const start = performance.now();
6
+ const configInfo = findConfigFile(path);
7
+ if (!configInfo) {
8
+ console.error('Error: No devarings.yml found. Run from a fabric root or pass a path.');
9
+ process.exit(1);
10
+ }
11
+ const config = loadConfig(configInfo);
12
+ const catalogue = resolveTypes();
13
+ const files = await discoverAtoms(config.root);
14
+ const atoms = files.map((f) => parse(f.relativePath, f.content));
15
+ const result = await validate(atoms, catalogue, config);
16
+ const elapsed = (performance.now() - start).toFixed(0);
17
+ if (options.json) {
18
+ console.log(formatJson(result));
19
+ }
20
+ else {
21
+ console.log(formatText(result));
22
+ console.log(`\n Done in ${elapsed}ms`);
23
+ }
24
+ process.exit(result.summary.errors > 0 ? 1 : 0);
25
+ }
26
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAClG,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAMxD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,OAAqB;IAC7D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAE/B,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAA;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IAEvD,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAEtD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IACjC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,CAAC,CAAA;IACzC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function compile(path: string): Promise<void>;
2
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/commands/compile.ts"],"names":[],"mappings":"AAWA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzD"}
@@ -0,0 +1,36 @@
1
+ import { COMPILE_RULE_PREFIX, findConfigFile, loadConfig, parse, resolveTypes, TYPES, validate, } from '@devarings/fabric-core';
2
+ import { discoverAtoms } from '../discover.js';
3
+ export async function compile(path) {
4
+ const start = performance.now();
5
+ const configInfo = findConfigFile(path);
6
+ if (!configInfo) {
7
+ console.error('Error: No devarings.yml found. Run from a fabric root or pass a path.');
8
+ process.exit(1);
9
+ }
10
+ const config = loadConfig(configInfo);
11
+ const catalogue = resolveTypes();
12
+ const files = await discoverAtoms(config.root);
13
+ const atoms = files.map((f) => parse(f.relativePath, f.content));
14
+ const result = await validate(atoms, catalogue, config);
15
+ const compileDiags = result.diagnostics.filter((d) => d.rule.startsWith(COMPILE_RULE_PREFIX));
16
+ const contractCount = atoms.filter((a) => a.frontmatter.type === TYPES.CONTRACT).length;
17
+ const errors = compileDiags.filter((d) => d.severity === 'error').length;
18
+ const elapsed = (performance.now() - start).toFixed(0);
19
+ if (compileDiags.length === 0 && contractCount === 0) {
20
+ console.log('No contracts found in the fabric.');
21
+ }
22
+ else if (compileDiags.length === 0) {
23
+ console.log(`\x1b[32m\u2713\x1b[0m ${contractCount} contracts compiled successfully`);
24
+ }
25
+ else {
26
+ for (const d of compileDiags) {
27
+ const icon = d.severity === 'error' ? '\x1b[31m\u2717\x1b[0m' : '\x1b[33m\u26A0\x1b[0m';
28
+ const line = d.line ? `:${d.line}` : '';
29
+ console.log(`${icon} ${d.file}${line} ${d.message}`);
30
+ }
31
+ console.log(`\n${contractCount} contracts, ${errors} errors`);
32
+ }
33
+ console.log(`\n Done in ${elapsed}ms`);
34
+ process.exit(errors > 0 ? 1 : 0);
35
+ }
36
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/commands/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { TypeCatalogue } from '@devarings/fabric-core';
2
+ export interface CreateOptions {
3
+ id: string;
4
+ domain: string;
5
+ topic: string;
6
+ }
7
+ export declare function createAtom(typeName: string, fabricRoot: string, catalogue: TypeCatalogue, options: CreateOptions): string;
8
+ export declare function createTopic(fabricRoot: string, catalogue: TypeCatalogue, options: {
9
+ domain: string;
10
+ topic: string;
11
+ }): string[];
12
+ interface CreateActionOptions {
13
+ id?: string | undefined;
14
+ domain: string;
15
+ topic: string;
16
+ }
17
+ export declare function create(typeName: string, options: CreateActionOptions): void;
18
+ export {};
19
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAG3D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,aAAa,GACrB,MAAM,CAYR;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzC,MAAM,EAAE,CA6BV;AA6CD,UAAU,mBAAmB;IAC3B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAoC3E"}
@@ -0,0 +1,114 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { findConfigFile, loadConfig, resolveTypes } from '@devarings/fabric-core';
4
+ export function createAtom(typeName, fabricRoot, catalogue, options) {
5
+ const typeDecl = catalogue.types.get(typeName);
6
+ if (!typeDecl) {
7
+ throw new Error(`Unknown type "${typeName}". Available types: ${[...catalogue.types.keys()].join(', ')}`);
8
+ }
9
+ const content = renderTemplate(typeDecl.template, options);
10
+ const filePath = resolveAtomPath(typeName, fabricRoot, options);
11
+ writeFileSafe(filePath, content);
12
+ return filePath;
13
+ }
14
+ export function createTopic(fabricRoot, catalogue, options) {
15
+ const created = [];
16
+ const prefix = options.topic;
17
+ // Overview
18
+ const ovwPath = createAtom('overview', fabricRoot, catalogue, {
19
+ id: `OVW-${prefix}`,
20
+ domain: options.domain,
21
+ topic: options.topic,
22
+ });
23
+ created.push(ovwPath);
24
+ // Spec
25
+ const specPath = createAtom('spec', fabricRoot, catalogue, {
26
+ id: `SPEC-${prefix}`,
27
+ domain: options.domain,
28
+ topic: options.topic,
29
+ });
30
+ created.push(specPath);
31
+ // Decisions directory placeholder
32
+ const decisionsDir = join(fabricRoot, options.domain, options.topic, 'design', 'decisions');
33
+ if (!existsSync(decisionsDir)) {
34
+ mkdirSync(decisionsDir, { recursive: true });
35
+ writeFileSync(join(decisionsDir, '.gitkeep'), '', 'utf-8');
36
+ created.push(join(decisionsDir, '.gitkeep'));
37
+ }
38
+ return created;
39
+ }
40
+ function renderTemplate(template, options) {
41
+ const today = new Date().toISOString().slice(0, 10);
42
+ return template
43
+ .replace(/\{id\}/g, options.id)
44
+ .replace(/\{domain\}/g, options.domain)
45
+ .replace(/\{topic\}/g, options.topic)
46
+ .replace(/\{date\}/g, today)
47
+ .replace(/\{title\}/g, options.topic);
48
+ }
49
+ function writeFileSafe(filePath, content) {
50
+ const dir = dirname(filePath);
51
+ if (!existsSync(dir)) {
52
+ mkdirSync(dir, { recursive: true });
53
+ }
54
+ writeFileSync(filePath, content, 'utf-8');
55
+ }
56
+ function resolveAtomPath(typeName, fabricRoot, options) {
57
+ const base = join(fabricRoot, options.domain, options.topic);
58
+ switch (typeName) {
59
+ case 'overview':
60
+ return join(base, 'overview.md');
61
+ case 'spec':
62
+ return join(base, 'design', 'spec.md');
63
+ case 'tech-decision':
64
+ return join(base, 'design', 'decisions', `${options.id}.md`);
65
+ case 'prd':
66
+ return join(base, 'discover', 'prd.md');
67
+ case 'feature':
68
+ return join(base, 'discover', 'features', `${options.id}.yaml`);
69
+ case 'roadmap':
70
+ return join(base, 'plan', 'roadmap.md');
71
+ case 'convention':
72
+ return join(fabricRoot, 'conventions', `${options.topic}.md`);
73
+ default:
74
+ return join(base, `${options.id}.md`);
75
+ }
76
+ }
77
+ export function create(typeName, options) {
78
+ const configInfo = findConfigFile(process.cwd());
79
+ if (!configInfo) {
80
+ console.error('Error: No devarings.yml found.');
81
+ process.exit(1);
82
+ }
83
+ const config = loadConfig(configInfo);
84
+ const catalogue = resolveTypes();
85
+ try {
86
+ if (typeName === 'topic') {
87
+ const files = createTopic(config.root, catalogue, {
88
+ domain: options.domain,
89
+ topic: options.topic,
90
+ });
91
+ console.log(`Created topic "${options.domain}/${options.topic}" with ${files.length} files:`);
92
+ for (const f of files) {
93
+ console.log(` ${f}`);
94
+ }
95
+ }
96
+ else {
97
+ if (!options.id) {
98
+ console.error('Missing required option: --id');
99
+ process.exit(1);
100
+ }
101
+ const filePath = createAtom(typeName, config.root, catalogue, {
102
+ id: options.id,
103
+ domain: options.domain,
104
+ topic: options.topic,
105
+ });
106
+ console.log(`Created ${typeName} atom: ${filePath}`);
107
+ }
108
+ }
109
+ catch (err) {
110
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
111
+ process.exit(1);
112
+ }
113
+ }
114
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface DiffOptions {
2
+ ref?: string | undefined;
3
+ }
4
+ export declare function diff(path: string, options: DiffOptions): void;
5
+ export {};
6
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CA6E7D"}
@@ -0,0 +1,73 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { relative, resolve } from 'node:path';
4
+ import { findConfigFile, loadConfig, parse } from '@devarings/fabric-core';
5
+ export function diff(path, options) {
6
+ const configInfo = findConfigFile(path);
7
+ if (!configInfo) {
8
+ console.error('Error: No devarings.yml found.');
9
+ process.exit(1);
10
+ }
11
+ const config = loadConfig(configInfo);
12
+ const ref = options.ref ?? 'HEAD';
13
+ let gitOutput;
14
+ try {
15
+ gitOutput = execSync(`git diff --name-status ${ref}`, {
16
+ cwd: config.configDir,
17
+ encoding: 'utf-8',
18
+ });
19
+ }
20
+ catch {
21
+ console.error('Error: Could not run git diff. Is this a git repository?');
22
+ process.exit(1);
23
+ }
24
+ if (!gitOutput.trim()) {
25
+ console.log('No changes since', ref);
26
+ return;
27
+ }
28
+ const lines = gitOutput.trim().split('\n');
29
+ const fabricRoot = config.root;
30
+ const fabricRelative = relative(config.configDir, fabricRoot);
31
+ let fabricChanges = 0;
32
+ let codeChanges = 0;
33
+ console.log(`\x1b[1mFabric Diff\x1b[0m — ${ref} → working tree\n`);
34
+ for (const line of lines) {
35
+ const [status, filePath] = line.split('\t');
36
+ if (!status || !filePath) {
37
+ continue;
38
+ }
39
+ const isFabric = filePath.startsWith(fabricRelative) || filePath.startsWith('.devarings/');
40
+ const isPackage = filePath.startsWith('packages/');
41
+ if (isFabric) {
42
+ fabricChanges++;
43
+ const icon = status === 'A'
44
+ ? '\x1b[32m+\x1b[0m'
45
+ : status === 'D'
46
+ ? '\x1b[31m-\x1b[0m'
47
+ : '\x1b[33m~\x1b[0m';
48
+ const label = status === 'A' ? 'added' : status === 'D' ? 'deleted' : 'modified';
49
+ // Try to read atom metadata for added/modified files
50
+ let meta = '';
51
+ if (status !== 'D') {
52
+ try {
53
+ const absolutePath = resolve(config.configDir, filePath);
54
+ const content = readFileSync(absolutePath, 'utf-8');
55
+ const atom = parse(filePath, content);
56
+ const type = atom.frontmatter.type ?? '?';
57
+ const atomStatus = atom.frontmatter.status ?? '?';
58
+ meta = `\x1b[2m(${String(type)}, ${String(atomStatus)})\x1b[0m`;
59
+ }
60
+ catch {
61
+ // Can't parse — skip metadata
62
+ }
63
+ }
64
+ console.log(` ${icon} ${filePath} ${label} ${meta}`);
65
+ }
66
+ else if (isPackage) {
67
+ codeChanges++;
68
+ }
69
+ }
70
+ console.log('');
71
+ console.log(`${fabricChanges} fabric changes, ${codeChanges} code changes`);
72
+ }
73
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface HealthOptions {
2
+ json?: true | undefined;
3
+ }
4
+ export declare function health(path: string, options: HealthOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/commands/health.ts"],"names":[],"mappings":"AAWA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;CACxB;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChF"}
@@ -0,0 +1,27 @@
1
+ import { computeDetailedHealth, findConfigFile, loadConfig, parse, resolveTypes, validate, } from '@devarings/fabric-core';
2
+ import { discoverAtoms } from '../discover.js';
3
+ import { formatHealth } from '../formatter.js';
4
+ export async function health(path, options) {
5
+ const start = performance.now();
6
+ const configInfo = findConfigFile(path);
7
+ if (!configInfo) {
8
+ console.error('Error: No devarings.yml found.');
9
+ process.exit(1);
10
+ }
11
+ const config = loadConfig(configInfo);
12
+ const catalogue = resolveTypes();
13
+ const files = await discoverAtoms(config.root);
14
+ const atoms = files.map((f) => parse(f.relativePath, f.content));
15
+ const result = await validate(atoms, catalogue, config);
16
+ const detailed = computeDetailedHealth(atoms, result.diagnostics, result.summary.edgeCoverage, result.summary.gapCount);
17
+ const elapsed = (performance.now() - start).toFixed(0);
18
+ if (options.json) {
19
+ console.log(JSON.stringify(detailed, null, 2));
20
+ }
21
+ else {
22
+ console.log(formatHealth(detailed, config.workspace));
23
+ console.log(`\n Done in ${elapsed}ms`);
24
+ }
25
+ process.exit(detailed.score >= 80 ? 0 : 1);
26
+ }
27
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/commands/health.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,UAAU,EACV,KAAK,EACL,YAAY,EACZ,QAAQ,GACT,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAM9C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,OAAsB;IAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAE/B,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IAEvD,MAAM,QAAQ,GAAG,qBAAqB,CACpC,KAAK,EACL,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,OAAO,CAAC,YAAY,EAC3B,MAAM,CAAC,OAAO,CAAC,QAAQ,CACxB,CAAA;IAED,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAEtD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QACrD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,CAAC,CAAA;IACzC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function init(path: string, options: {
2
+ template?: string;
3
+ }): void;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAGA,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA8BvE"}
@@ -0,0 +1,29 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export function init(path, options) {
4
+ const configPath = join(path, 'devarings.yml');
5
+ if (existsSync(configPath)) {
6
+ console.error('Error: devarings.yml already exists in this directory.');
7
+ process.exit(1);
8
+ }
9
+ // Dynamic import to avoid hard dependency on create-fabric
10
+ import('create-fabric')
11
+ .then(({ scaffold }) => {
12
+ const template = options.template === 'starter' ? 'starter' : 'blank';
13
+ const name = path.split('/').pop() ?? 'my-fabric';
14
+ console.log(`\nInitializing fabric in current directory with ${template} template...\n`);
15
+ const created = scaffold(path, { name, template });
16
+ for (const file of created) {
17
+ console.log(` ${file}`);
18
+ }
19
+ console.log(`\n\u2713 Initialized ${created.length} files`);
20
+ console.log('\nNext steps:');
21
+ console.log(' dvs fabric check .');
22
+ console.log('');
23
+ })
24
+ .catch(() => {
25
+ console.error('Error: create-fabric package not found. Install it first.');
26
+ process.exit(1);
27
+ });
28
+ }
29
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,OAA8B;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IAC9C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAA;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,2DAA2D;IAC3D,MAAM,CAAC,eAAe,CAAC;SACpB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAA;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,WAAW,CAAA;QAEjD,OAAO,CAAC,GAAG,CAAC,mDAAmD,QAAQ,gBAAgB,CAAC,CAAA;QAExF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QAElD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;QAC1B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;QAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjB,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAA;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function install(sourcePath: string): void;
2
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/install.ts"],"names":[],"mappings":"AAKA,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAmDhD"}
@@ -0,0 +1,48 @@
1
+ import { cpSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
2
+ import { basename, join, resolve } from 'node:path';
3
+ import { findConfigFile, loadConfig } from '@devarings/fabric-core';
4
+ import yaml from 'js-yaml';
5
+ export function install(sourcePath) {
6
+ const absoluteSource = resolve(sourcePath);
7
+ if (!existsSync(absoluteSource)) {
8
+ console.error(`Error: Path "${sourcePath}" does not exist.`);
9
+ process.exit(1);
10
+ }
11
+ // Read manifest from devarings.yml (package: section) or legacy fabric-package.yaml
12
+ const devaringsPath = join(absoluteSource, 'devarings.yml');
13
+ const legacyPath = join(absoluteSource, 'fabric-package.yaml');
14
+ let packageName;
15
+ let version;
16
+ if (existsSync(devaringsPath)) {
17
+ const content = readFileSync(devaringsPath, 'utf-8');
18
+ const config = yaml.load(content);
19
+ const pkg = (config.package ?? {});
20
+ packageName = String(pkg.name ?? basename(absoluteSource));
21
+ version = String(pkg.version ?? '0.0.0');
22
+ }
23
+ else if (existsSync(legacyPath)) {
24
+ const content = readFileSync(legacyPath, 'utf-8');
25
+ const manifest = yaml.load(content);
26
+ packageName = String(manifest.name ?? basename(absoluteSource));
27
+ version = String(manifest.version ?? '0.0.0');
28
+ }
29
+ else {
30
+ console.error(`Error: No devarings.yml found in "${sourcePath}".`);
31
+ process.exit(1);
32
+ }
33
+ // Find fabric root
34
+ const configInfo = findConfigFile(process.cwd());
35
+ if (!configInfo) {
36
+ console.error('Error: No devarings.yml found.');
37
+ process.exit(1);
38
+ }
39
+ const config = loadConfig(configInfo);
40
+ const depsDir = join(config.configDir, '.fabric', 'deps', packageName);
41
+ if (existsSync(depsDir)) {
42
+ console.log(`Package "${packageName}" already installed. Replacing...`);
43
+ }
44
+ mkdirSync(depsDir, { recursive: true });
45
+ cpSync(absoluteSource, depsDir, { recursive: true });
46
+ console.log(`\x1b[32m\u2713\x1b[0m Installed ${packageName}@${version} → .fabric/deps/${packageName}/`);
47
+ }
48
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function lint(path: string): void;
2
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../../src/commands/lint.ts"],"names":[],"mappings":"AAGA,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA4BvC"}
@@ -0,0 +1,29 @@
1
+ import { join, resolve } from 'node:path';
2
+ import { lintCode } from '@devarings/fabric-core';
3
+ export function lint(path) {
4
+ const targetDir = resolve(path);
5
+ const packagesDir = join(targetDir, 'packages');
6
+ const start = performance.now();
7
+ const result = lintCode(packagesDir);
8
+ const elapsed = (performance.now() - start).toFixed(0);
9
+ for (const d of result.diagnostics) {
10
+ const icon = d.severity === 'error' ? '\x1b[31m\u2717\x1b[0m' : '\x1b[33m\u26A0\x1b[0m';
11
+ const line = d.line ? `:${d.line}` : '';
12
+ console.log(`${icon} ${d.file}${line}`);
13
+ console.log(` ${d.message}`);
14
+ if (d.suggestion) {
15
+ console.log(` \x1b[2m\u2192 ${d.suggestion}\x1b[0m`);
16
+ }
17
+ console.log('');
18
+ }
19
+ const { errors, warnings } = result.summary;
20
+ if (errors === 0 && warnings === 0) {
21
+ console.log('\x1b[32mPASS\x1b[0m No code lint violations found.');
22
+ }
23
+ else {
24
+ console.log(`\x1b[31mFAIL\x1b[0m ${errors} errors, ${warnings} warnings`);
25
+ }
26
+ console.log(`\n Done in ${elapsed}ms`);
27
+ process.exit(errors > 0 ? 1 : 0);
28
+ }
29
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/commands/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAEjD,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IAE/C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAEtD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAA;QACvF,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACvC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAA;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7B,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,UAAU,SAAS,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAA;IAC3C,IAAI,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAA;IACnE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,YAAY,QAAQ,WAAW,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,CAAC,CAAA;IACvC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function publish(path: string): Promise<void>;
2
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/commands/publish.ts"],"names":[],"mappings":"AAMA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEzD"}
@@ -0,0 +1,66 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { findConfigFile, loadConfig, parse, resolveTypes, validate } from '@devarings/fabric-core';
4
+ import yaml from 'js-yaml';
5
+ import { discoverAtoms } from '../discover.js';
6
+ export async function publish(path) {
7
+ const targetDir = resolve(path);
8
+ console.log('\x1b[1mPre-publish validation\x1b[0m\n');
9
+ // 1. Check devarings.yml with package: section (or legacy fabric-package.yaml)
10
+ const devaringsPath = join(targetDir, 'devarings.yml');
11
+ const legacyPath = join(targetDir, 'fabric-package.yaml');
12
+ let pkgName;
13
+ let pkgVersion;
14
+ if (existsSync(devaringsPath)) {
15
+ const config = yaml.load(readFileSync(devaringsPath, 'utf-8'));
16
+ const pkg = (config.package ?? {});
17
+ pkgName = String(pkg.name ?? '');
18
+ pkgVersion = String(pkg.version ?? '');
19
+ if (!pkgName || !pkgVersion) {
20
+ console.error('\x1b[31m\u2717\x1b[0m devarings.yml package section missing name or version');
21
+ process.exit(1);
22
+ }
23
+ console.log('\x1b[32m\u2713\x1b[0m devarings.yml with package config found');
24
+ }
25
+ else if (existsSync(legacyPath)) {
26
+ const manifest = yaml.load(readFileSync(legacyPath, 'utf-8'));
27
+ pkgName = String(manifest.name ?? '');
28
+ pkgVersion = String(manifest.version ?? '');
29
+ if (!pkgName || !pkgVersion) {
30
+ console.error('\x1b[31m\u2717\x1b[0m fabric-package.yaml missing name or version');
31
+ process.exit(1);
32
+ }
33
+ console.log('\x1b[32m\u2713\x1b[0m fabric-package.yaml found (legacy format)');
34
+ }
35
+ else {
36
+ console.error('\x1b[31m\u2717\x1b[0m No devarings.yml or fabric-package.yaml found');
37
+ process.exit(1);
38
+ }
39
+ console.log(`\x1b[32m\u2713\x1b[0m Package: ${pkgName}@${pkgVersion}`);
40
+ // 2. Check README.md exists
41
+ if (!existsSync(join(targetDir, 'README.md'))) {
42
+ console.error('\x1b[31m\u2717\x1b[0m README.md not found');
43
+ process.exit(1);
44
+ }
45
+ console.log('\x1b[32m\u2713\x1b[0m README.md found');
46
+ // 3. Run full validation — score must be 100
47
+ const configInfo = findConfigFile(targetDir);
48
+ if (configInfo) {
49
+ const config = loadConfig(configInfo);
50
+ const catalogue = resolveTypes();
51
+ const files = await discoverAtoms(config.root);
52
+ const atoms = files.map((f) => parse(f.relativePath, f.content));
53
+ const result = await validate(atoms, catalogue, config);
54
+ if (result.summary.errors > 0) {
55
+ console.error(`\x1b[31m\u2717\x1b[0m Validation failed: ${result.summary.errors} errors`);
56
+ process.exit(1);
57
+ }
58
+ console.log(`\x1b[32m\u2713\x1b[0m Validation: Score ${result.summary.score}/100`);
59
+ }
60
+ else {
61
+ console.log('\x1b[33m\u26A0\x1b[0m No fabric config found — skipping validation');
62
+ }
63
+ console.log('\n\x1b[32mPASS\x1b[0m Package ready to publish (--dry-run)');
64
+ console.log('\x1b[2mActual publishing requires a registry backend (Hive-side).\x1b[0m');
65
+ }
66
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface ReplayOptions {
2
+ topic?: string | undefined;
3
+ verbose?: true | undefined;
4
+ }
5
+ export declare function replay(path: string, options: ReplayOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../../src/commands/replay.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,OAAO,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;CAC3B;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkEhF"}
@@ -0,0 +1,57 @@
1
+ import { findConfigFile, loadConfig, parse, runReplay } from '@devarings/fabric-core';
2
+ import { discoverAtoms } from '../discover.js';
3
+ export async function replay(path, options) {
4
+ const start = performance.now();
5
+ const configInfo = findConfigFile(path);
6
+ if (!configInfo) {
7
+ console.error('Error: No devarings.yml found.');
8
+ process.exit(1);
9
+ }
10
+ const config = loadConfig(configInfo);
11
+ const files = await discoverAtoms(config.root);
12
+ let atoms = files.map((f) => parse(f.relativePath, f.content));
13
+ if (options.topic) {
14
+ atoms = atoms.filter((a) => a.frontmatter.topic === options.topic);
15
+ }
16
+ const { diagnostics, results } = runReplay(atoms);
17
+ const elapsed = (performance.now() - start).toFixed(0);
18
+ if (results.length === 0) {
19
+ console.log('No state machines with matching scenarios found.');
20
+ console.log(`\n Done in ${elapsed}ms`);
21
+ return;
22
+ }
23
+ for (const result of results) {
24
+ const icon = result.passed ? '\x1b[32m\u2713\x1b[0m' : '\x1b[31m\u2717\x1b[0m';
25
+ console.log(`${icon} ${result.scenarioId} against ${result.stateMachineId}`);
26
+ if (options.verbose || !result.passed) {
27
+ for (const step of result.steps) {
28
+ const stepIcon = step.valid ? '\x1b[32m\u2713\x1b[0m' : '\x1b[31m\u2717\x1b[0m';
29
+ console.log(` ${stepIcon} ${step.event}: ${step.fromState} \u2192 ${step.toState}`);
30
+ if (step.error) {
31
+ console.log(` \x1b[31m${step.error}\x1b[0m`);
32
+ }
33
+ }
34
+ }
35
+ console.log(` Coverage: ${result.coverage.covered}/${result.coverage.total} transitions (${result.coverage.percent}%)`);
36
+ if (result.coverage.uncovered.length > 0 && options.verbose) {
37
+ for (const t of result.coverage.uncovered) {
38
+ console.log(` \x1b[2m\u2717 ${t.from} \u2192 ${t.to} (${t.event})\x1b[0m`);
39
+ }
40
+ }
41
+ console.log('');
42
+ }
43
+ const passed = results.filter((r) => r.passed).length;
44
+ const failed = results.filter((r) => !r.passed).length;
45
+ if (diagnostics.length > 0) {
46
+ console.log('\x1b[1mDiagnostics:\x1b[0m');
47
+ for (const d of diagnostics) {
48
+ const icon = d.severity === 'error' ? '\x1b[31m\u2717\x1b[0m' : '\x1b[33m\u26A0\x1b[0m';
49
+ console.log(` ${icon} ${d.file}: ${d.message}`);
50
+ }
51
+ console.log('');
52
+ }
53
+ console.log(`${passed} passed, ${failed} failed`);
54
+ console.log(`\n Done in ${elapsed}ms`);
55
+ process.exit(failed > 0 ? 1 : 0);
56
+ }
57
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../src/commands/replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function watchFabric(path: string): Promise<void>;
2
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/commands/watch.ts"],"names":[],"mappings":"AAcA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkE7D"}
@@ -0,0 +1,61 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createValidationCache, findConfigFile, incrementalValidate, loadConfig, parse, resolveTypes, validate, } from '@devarings/fabric-core';
3
+ import { watch } from 'chokidar';
4
+ import { discoverAtoms } from '../discover.js';
5
+ import { formatText } from '../formatter.js';
6
+ export async function watchFabric(path) {
7
+ const configInfo = findConfigFile(path);
8
+ if (!configInfo) {
9
+ console.error('Error: No devarings.yml found.');
10
+ process.exit(1);
11
+ }
12
+ const config = loadConfig(configInfo);
13
+ const catalogue = resolveTypes();
14
+ const cache = createValidationCache();
15
+ console.log(`\x1b[1mFabric Watch\x1b[0m — ${config.workspace}`);
16
+ console.log(`Watching: ${config.root}`);
17
+ console.log('Press Ctrl+C to stop.\n');
18
+ // Initial full validation
19
+ await runFullValidation(config.root, catalogue, config);
20
+ // Watch for changes
21
+ const watcher = watch(['**/*.md', '**/*.yaml', '**/*.yml', '**/*.ts', '**/*.sql'], {
22
+ cwd: config.root,
23
+ ignored: ['**/node_modules/**', '**/dist/**', '**/.git/**', '**/.turbo/**'],
24
+ persistent: true,
25
+ ignoreInitial: true,
26
+ });
27
+ watcher.on('change', async (filePath) => {
28
+ const absolutePath = `${config.root}/${filePath}`;
29
+ const content = readFileSync(absolutePath, 'utf-8');
30
+ // Quick check: is the file already cached with same content?
31
+ if (cache.has(filePath, content)) {
32
+ return;
33
+ }
34
+ console.clear();
35
+ console.log(`\x1b[2m[${new Date().toLocaleTimeString()}]\x1b[0m Changed: ${filePath}\n`);
36
+ // Incremental: re-parse changed file + full validation
37
+ const files = await discoverAtoms(config.root);
38
+ const fileData = files.map((f) => ({ path: f.relativePath, content: f.content }));
39
+ const { atoms, changed, cached } = incrementalValidate(fileData, parse, catalogue, config, cache);
40
+ console.log(`\x1b[2mParsed: ${changed} changed, ${cached} cached\x1b[0m\n`);
41
+ // Full validation (L3 + compile + replay need all atoms)
42
+ const result = await validate(atoms, catalogue, config);
43
+ console.log(formatText(result));
44
+ console.log(`\n\x1b[2mWaiting for changes...\x1b[0m`);
45
+ });
46
+ watcher.on('add', async () => {
47
+ await runFullValidation(config.root, catalogue, config);
48
+ });
49
+ watcher.on('unlink', async () => {
50
+ cache.clear();
51
+ await runFullValidation(config.root, catalogue, config);
52
+ });
53
+ }
54
+ async function runFullValidation(root, catalogue, config) {
55
+ const files = await discoverAtoms(root);
56
+ const atoms = files.map((f) => parse(f.relativePath, f.content));
57
+ const result = await validate(atoms, catalogue, config);
58
+ console.log(formatText(result));
59
+ console.log(`\n\x1b[2mWaiting for changes...\x1b[0m`);
60
+ }
61
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,KAAK,EACL,YAAY,EACZ,QAAQ,GACT,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAA;IAErC,OAAO,CAAC,GAAG,CAAC,gCAAgC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;IAC/D,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IAEtC,0BAA0B;IAC1B,MAAM,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IAEvD,oBAAoB;IACpB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;QACjF,GAAG,EAAE,MAAM,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,CAAC;QAC3E,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACtC,MAAM,YAAY,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAA;QACjD,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAEnD,6DAA6D;QAC7D,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YACjC,OAAM;QACR,CAAC;QAED,OAAO,CAAC,KAAK,EAAE,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,QAAQ,IAAI,CAAC,CAAA;QAExF,uDAAuD;QACvD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAEjF,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,mBAAmB,CACpD,QAAQ,EACR,KAAK,EACL,SAAS,EACT,MAAM,EACN,KAAK,CACN,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,aAAa,MAAM,kBAAkB,CAAC,CAAA;QAE3E,yDAAyD;QACzD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QACvD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;QAC3B,MAAM,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,MAAM,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAY,EACZ,SAA0C,EAC1C,MAAqC;IAErC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;AACvD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type { DiscoveredFile } from '@devarings/fabric-core';
2
+ export { discoverAtoms } from '@devarings/fabric-core';
3
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/discover.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,3 @@
1
+ // Re-export from fabric-core — discover is a core capability
2
+ export { discoverAtoms } from '@devarings/fabric-core';
3
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/discover.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { DetailedHealthMetrics, ValidationResult } from '@devarings/fabric-core';
2
+ export declare function formatText(result: ValidationResult, useColor?: boolean): string;
3
+ export declare function formatJson(result: ValidationResult): string;
4
+ export declare function formatHealth(health: DetailedHealthMetrics, workspace: string, useColor?: boolean): string;
5
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AASrF,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,UAAO,GAAG,MAAM,CA2C5E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAE3D;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,qBAAqB,EAC7B,SAAS,EAAE,MAAM,EACjB,QAAQ,UAAO,GACd,MAAM,CA8ER"}
@@ -0,0 +1,106 @@
1
+ const RED = '\x1b[31m';
2
+ const YELLOW = '\x1b[33m';
3
+ const GREEN = '\x1b[32m';
4
+ const DIM = '\x1b[2m';
5
+ const BOLD = '\x1b[1m';
6
+ const RESET = '\x1b[0m';
7
+ export function formatText(result, useColor = true) {
8
+ const c = useColor
9
+ ? { red: RED, yellow: YELLOW, green: GREEN, dim: DIM, bold: BOLD, reset: RESET }
10
+ : { red: '', yellow: '', green: '', dim: '', bold: '', reset: '' };
11
+ const lines = [];
12
+ // Group diagnostics by file
13
+ const byFile = new Map();
14
+ for (const d of result.diagnostics) {
15
+ const existing = byFile.get(d.file);
16
+ if (existing) {
17
+ existing.push(d);
18
+ }
19
+ else {
20
+ byFile.set(d.file, [d]);
21
+ }
22
+ }
23
+ for (const [file, diagnostics] of byFile) {
24
+ lines.push(`${c.bold}${file}${c.reset}`);
25
+ for (const d of diagnostics) {
26
+ const icon = d.severity === 'error' ? `${c.red}\u2717${c.reset}` : `${c.yellow}\u26A0${c.reset}`;
27
+ const line = d.line ? `:${d.line}` : '';
28
+ lines.push(` ${icon} ${c.dim}${d.rule}${c.reset}${line} ${d.message}`);
29
+ if (d.suggestion) {
30
+ lines.push(` ${c.dim}\u2192 ${d.suggestion}${c.reset}`);
31
+ }
32
+ }
33
+ lines.push('');
34
+ }
35
+ // Summary
36
+ const { atomsChecked, errors, warnings, score, edgeCoverage, gapCount } = result.summary;
37
+ const status = errors > 0 ? `${c.red}FAIL${c.reset}` : `${c.green}PASS${c.reset}`;
38
+ const scoreColor = score >= 80 ? c.green : score >= 50 ? c.yellow : c.red;
39
+ const covColor = edgeCoverage >= 80 ? c.green : edgeCoverage >= 50 ? c.yellow : c.red;
40
+ lines.push(`${status} ${atomsChecked} atoms checked, ${c.red}${errors} errors${c.reset}, ${c.yellow}${warnings} warnings${c.reset} — Score: ${scoreColor}${score}/100${c.reset}`);
41
+ lines.push(` Edge coverage: ${covColor}${edgeCoverage}%${c.reset} | ${gapCount} gaps detected`);
42
+ return lines.join('\n');
43
+ }
44
+ export function formatJson(result) {
45
+ return JSON.stringify(result, null, 2);
46
+ }
47
+ export function formatHealth(health, workspace, useColor = true) {
48
+ const c = useColor
49
+ ? { red: RED, yellow: YELLOW, green: GREEN, dim: DIM, bold: BOLD, reset: RESET }
50
+ : { red: '', yellow: '', green: '', dim: '', bold: '', reset: '' };
51
+ const lines = [];
52
+ // Header
53
+ const scoreColor = health.score >= 80 ? c.green : health.score >= 50 ? c.yellow : c.red;
54
+ const icon = health.score >= 80 ? '\u2713' : health.score >= 50 ? '\u26A0' : '\u2717';
55
+ lines.push(`${c.bold}Fabric Health \u2014 ${workspace}${c.reset}`);
56
+ lines.push(`${c.dim}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${c.reset}`);
57
+ lines.push('');
58
+ lines.push(`Score: ${scoreColor}${health.score}/100${c.reset} ${icon}`);
59
+ lines.push('');
60
+ // Inventory
61
+ lines.push(`${c.bold}Inventory:${c.reset}`);
62
+ const typeSummary = Object.entries(health.inventory.byType)
63
+ .sort(([, a], [, b]) => b - a)
64
+ .map(([type, count]) => `${count} ${type}`)
65
+ .join(', ');
66
+ lines.push(` ${health.inventory.totalAtoms} atoms (${typeSummary})`);
67
+ const domainSummary = Object.entries(health.inventory.byDomain)
68
+ .sort(([, a], [, b]) => b - a)
69
+ .map(([domain, count]) => `${domain}: ${count}`)
70
+ .join(', ');
71
+ lines.push(` ${Object.keys(health.inventory.byDomain).length} domains (${domainSummary})`);
72
+ if (health.inventory.contractsCompiled > 0) {
73
+ lines.push(` ${c.green}${health.inventory.contractsCompiled} contracts compiled \u2713${c.reset}`);
74
+ }
75
+ lines.push('');
76
+ // Diagnostics breakdown
77
+ lines.push(`${c.bold}Diagnostics:${c.reset}`);
78
+ const errCount = health.errorPenalty / 10;
79
+ const warnCount = health.warnPenalty / 2;
80
+ if (errCount === 0 && warnCount === 0) {
81
+ lines.push(` ${c.green}0 errors, 0 warnings${c.reset}`);
82
+ }
83
+ else {
84
+ lines.push(` ${c.red}${errCount} errors${c.reset}, ${c.yellow}${warnCount} warnings${c.reset}`);
85
+ }
86
+ if (health.informational.glossaryViolations > 0) {
87
+ lines.push(` ${c.dim}${health.informational.glossaryViolations} glossary violations (informational)${c.reset}`);
88
+ }
89
+ if (health.informational.orphanAtoms > 0) {
90
+ lines.push(` ${c.dim}${health.informational.orphanAtoms} orphan atoms (informational)${c.reset}`);
91
+ }
92
+ if (health.informational.optionalEdgeGaps > 0) {
93
+ lines.push(` ${c.dim}${health.informational.optionalEdgeGaps} optional edge gaps (informational)${c.reset}`);
94
+ }
95
+ lines.push('');
96
+ // Coverage
97
+ lines.push(`${c.bold}Coverage:${c.reset}`);
98
+ const covColor = health.coverage.edgePercent >= 80
99
+ ? c.green
100
+ : health.coverage.edgePercent >= 50
101
+ ? c.yellow
102
+ : c.red;
103
+ lines.push(` Edge coverage: ${covColor}${health.coverage.edgePercent}%${c.reset} (${health.coverage.gapCount} gaps)`);
104
+ return lines.join('\n');
105
+ }
106
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { discoverAtoms } from './discover.js';
2
+ export { formatJson, formatText } from './formatter.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { discoverAtoms } from './discover.js';
2
+ export { formatJson, formatText } from './formatter.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@devarings/fabric-cli",
3
+ "version": "0.2.1",
4
+ "description": "Fabric CLI — dvs fabric check/create/compile",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/devarings/fabric"
9
+ },
10
+ "keywords": [
11
+ "fabric",
12
+ "cli",
13
+ "validator"
14
+ ],
15
+ "type": "module",
16
+ "files": [
17
+ "dist",
18
+ "!dist/tsconfig.tsbuildinfo"
19
+ ],
20
+ "bin": {
21
+ "dvs-fabric": "./dist/bin/fabric.js"
22
+ },
23
+ "exports": {
24
+ ".": {
25
+ "import": "./dist/src/index.js",
26
+ "types": "./dist/src/index.d.ts"
27
+ }
28
+ },
29
+ "scripts": {
30
+ "build": "tsc --build",
31
+ "typecheck": "tsc --noEmit",
32
+ "lint": "biome check .",
33
+ "format": "biome check --write .",
34
+ "test": "vitest run"
35
+ },
36
+ "dependencies": {
37
+ "@devarings/fabric-core": "workspace:*",
38
+ "chokidar": "^5.0.0",
39
+ "commander": "^14.0.3",
40
+ "create-fabric": "workspace:*",
41
+ "glob": "^13.0.6",
42
+ "js-yaml": "^4.1.1"
43
+ },
44
+ "devDependencies": {
45
+ "@types/js-yaml": "^4.0.9",
46
+ "@types/node": "^25.5.2"
47
+ }
48
+ }