@shapeshift-labs/loom 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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +248 -0
  3. package/dist/args.d.ts +9 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +52 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +83 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/common.d.ts +15 -0
  12. package/dist/common.d.ts.map +1 -0
  13. package/dist/common.js +82 -0
  14. package/dist/common.js.map +1 -0
  15. package/dist/config.d.ts +9 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +79 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/diff.d.ts +5 -0
  20. package/dist/diff.d.ts.map +1 -0
  21. package/dist/diff.js +24 -0
  22. package/dist/diff.js.map +1 -0
  23. package/dist/glob.d.ts +3 -0
  24. package/dist/glob.d.ts.map +1 -0
  25. package/dist/glob.js +58 -0
  26. package/dist/glob.js.map +1 -0
  27. package/dist/graph.d.ts +5 -0
  28. package/dist/graph.d.ts.map +1 -0
  29. package/dist/graph.js +11 -0
  30. package/dist/graph.js.map +1 -0
  31. package/dist/help.d.ts +2 -0
  32. package/dist/help.d.ts.map +1 -0
  33. package/dist/help.js +25 -0
  34. package/dist/help.js.map +1 -0
  35. package/dist/index.d.ts +13 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +12 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/init.d.ts +3 -0
  40. package/dist/init.d.ts.map +1 -0
  41. package/dist/init.js +43 -0
  42. package/dist/init.js.map +1 -0
  43. package/dist/output.d.ts +2 -0
  44. package/dist/output.d.ts.map +1 -0
  45. package/dist/output.js +45 -0
  46. package/dist/output.js.map +1 -0
  47. package/dist/project.d.ts +7 -0
  48. package/dist/project.d.ts.map +1 -0
  49. package/dist/project.js +33 -0
  50. package/dist/project.js.map +1 -0
  51. package/dist/scan.d.ts +8 -0
  52. package/dist/scan.d.ts.map +1 -0
  53. package/dist/scan.js +174 -0
  54. package/dist/scan.js.map +1 -0
  55. package/dist/snapshot.d.ts +7 -0
  56. package/dist/snapshot.d.ts.map +1 -0
  57. package/dist/snapshot.js +59 -0
  58. package/dist/snapshot.js.map +1 -0
  59. package/dist/status.d.ts +8 -0
  60. package/dist/status.d.ts.map +1 -0
  61. package/dist/status.js +51 -0
  62. package/dist/status.js.map +1 -0
  63. package/dist/store.d.ts +14 -0
  64. package/dist/store.d.ts.map +1 -0
  65. package/dist/store.js +66 -0
  66. package/dist/store.js.map +1 -0
  67. package/dist/swarm.d.ts +2 -0
  68. package/dist/swarm.d.ts.map +1 -0
  69. package/dist/swarm.js +14 -0
  70. package/dist/swarm.js.map +1 -0
  71. package/dist/types.d.ts +101 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +2 -0
  74. package/dist/types.js.map +1 -0
  75. package/frontier.source-policy.json +6 -0
  76. package/package.json +76 -0
package/dist/config.js ADDED
@@ -0,0 +1,79 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { abs, pathExists, readJson, resolveRoot, writeJson } from './common.js';
4
+ export const loomConfigFile = 'loom.json';
5
+ export const defaultIncludes = [
6
+ 'src/**/*.js',
7
+ 'src/**/*.mjs',
8
+ 'src/**/*.cjs',
9
+ 'src/**/*.ts',
10
+ 'test/**/*.js',
11
+ 'test/**/*.mjs',
12
+ 'packages/**/*.js',
13
+ 'packages/**/*.ts'
14
+ ];
15
+ export const defaultExcludes = [
16
+ 'node_modules/**',
17
+ 'dist/**',
18
+ 'coverage/**',
19
+ '.git/**',
20
+ '.loom/**'
21
+ ];
22
+ export function createLoomConfig(options = {}) {
23
+ const root = resolveRoot(options.root);
24
+ return {
25
+ kind: 'loom.config',
26
+ version: 1,
27
+ name: options.name ?? path.basename(root),
28
+ root: '.',
29
+ source: {
30
+ include: options.include?.length ? options.include : defaultIncludes,
31
+ exclude: options.exclude?.length ? [...defaultExcludes, ...options.exclude] : defaultExcludes,
32
+ languages: options.languages?.length ? options.languages : defaultLanguages(),
33
+ maxFileBytes: 512_000
34
+ },
35
+ generated: {
36
+ dir: '.loom',
37
+ graph: '.loom/graph',
38
+ objects: '.loom/objects',
39
+ refs: '.loom/refs',
40
+ logs: '.loom/logs',
41
+ info: '.loom/info',
42
+ hooks: '.loom/hooks',
43
+ runs: '.loom/runs',
44
+ queues: '.loom/queues',
45
+ evidence: '.loom/evidence',
46
+ projections: '.loom/projections',
47
+ locks: '.loom/locks'
48
+ },
49
+ frontier: {
50
+ semanticImport: true,
51
+ semanticImportMaxFiles: 400,
52
+ semanticImportMaxBytes: 2_000_000
53
+ }
54
+ };
55
+ }
56
+ export async function readLoomConfig(root = process.cwd()) {
57
+ const file = abs(resolveRoot(root), loomConfigFile);
58
+ if (!(await pathExists(file)))
59
+ throw new Error(`missing ${loomConfigFile}; run loom init first`);
60
+ return readJson(file);
61
+ }
62
+ export async function writeLoomConfig(root, config, force = false) {
63
+ const file = abs(root, loomConfigFile);
64
+ if (!force && await pathExists(file))
65
+ throw new Error(`${loomConfigFile} already exists; use --force to overwrite`);
66
+ await writeJson(file, config);
67
+ return file;
68
+ }
69
+ export async function readLoomIgnore(root) {
70
+ const file = abs(root, '.loomignore');
71
+ if (!(await pathExists(file)))
72
+ return [];
73
+ const text = await fs.readFile(file, 'utf8');
74
+ return text.split(/\r?\n/).map((line) => line.trim()).filter((line) => line && !line.startsWith('#'));
75
+ }
76
+ function defaultLanguages() {
77
+ return ['javascript', 'typescript', 'python', 'rust', 'c', 'csharp', 'go', 'java', 'kotlin', 'swift'];
78
+ }
79
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { LoomCommandResult } from './types.js';
2
+ export declare function diffLoomProject(options?: {
3
+ root?: string;
4
+ }): Promise<LoomCommandResult>;
5
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,wBAAsB,eAAe,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqBjG"}
package/dist/diff.js ADDED
@@ -0,0 +1,24 @@
1
+ import { resolveRoot } from './common.js';
2
+ import { readLoomGraph } from './graph.js';
3
+ import { scanLoomProject } from './scan.js';
4
+ export async function diffLoomProject(options = {}) {
5
+ const root = resolveRoot(options.root);
6
+ const graph = await readLoomGraph({ root });
7
+ const saved = new Map(graph.files.map((file) => [file.path, file]));
8
+ const fresh = await scanLoomProject({ root, write: false });
9
+ const current = new Map(fresh.graph.files.map((file) => [file.path, file]));
10
+ const added = [...current.keys()].filter((file) => !saved.has(file)).sort();
11
+ const deleted = [...saved.keys()].filter((file) => !current.has(file)).sort();
12
+ const changed = [...current.entries()]
13
+ .filter(([file, row]) => saved.has(file) && saved.get(file)?.sha256 !== row.sha256)
14
+ .map(([file]) => file)
15
+ .sort();
16
+ return {
17
+ ok: true,
18
+ message: `${added.length} added, ${changed.length} changed, ${deleted.length} deleted`,
19
+ added,
20
+ changed,
21
+ deleted
22
+ };
23
+ }
24
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA6B,EAAE;IACnE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC;SAClF,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;SACrB,IAAI,EAAE,CAAC;IAEV,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,UAAU;QACtF,KAAK;QACL,OAAO;QACP,OAAO;KACR,CAAC;AACJ,CAAC"}
package/dist/glob.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function listFiles(root: string): Promise<string[]>;
2
+ export declare function matchesAny(relative: string, patterns: string[]): boolean;
3
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../src/glob.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAI/D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAGxE"}
package/dist/glob.js ADDED
@@ -0,0 +1,58 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { rel } from './common.js';
4
+ export async function listFiles(root) {
5
+ const out = [];
6
+ await walk(root, root, out);
7
+ return out.sort();
8
+ }
9
+ export function matchesAny(relative, patterns) {
10
+ const normalized = relative.replaceAll('\\', '/');
11
+ return patterns.some((pattern) => globToRegExp(pattern).test(normalized));
12
+ }
13
+ async function walk(root, dir, out) {
14
+ const entries = await fs.readdir(dir, { withFileTypes: true });
15
+ for (const entry of entries) {
16
+ const file = path.join(dir, entry.name);
17
+ const relative = rel(root, file);
18
+ if (entry.isDirectory()) {
19
+ if (['.git', '.loom', 'node_modules', 'dist', 'coverage'].includes(entry.name))
20
+ continue;
21
+ await walk(root, file, out);
22
+ }
23
+ else if (entry.isFile() && !relative.startsWith('.')) {
24
+ out.push(file);
25
+ }
26
+ }
27
+ }
28
+ function globToRegExp(pattern) {
29
+ const normalized = pattern.replaceAll('\\', '/');
30
+ let source = '';
31
+ for (let index = 0; index < normalized.length; index += 1) {
32
+ const char = normalized[index];
33
+ const next = normalized[index + 1];
34
+ const afterNext = normalized[index + 2];
35
+ if (char === '*' && next === '*' && afterNext === '/') {
36
+ source += '(?:.*/)?';
37
+ index += 2;
38
+ }
39
+ else if (char === '*' && next === '*') {
40
+ source += '.*';
41
+ index += 1;
42
+ }
43
+ else if (char === '*') {
44
+ source += '[^/]*';
45
+ }
46
+ else if (char === '?') {
47
+ source += '[^/]';
48
+ }
49
+ else {
50
+ source += escapeRegExp(char ?? '');
51
+ }
52
+ }
53
+ return new RegExp(`^${source}$`);
54
+ }
55
+ function escapeRegExp(value) {
56
+ return value.replace(/[\\^$+?.()|[\]{}]/g, '\\$&');
57
+ }
58
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../src/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,QAAkB;IAC7D,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,GAAW,EAAE,GAAa;IAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzF,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtD,MAAM,IAAI,UAAU,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxC,MAAM,IAAI,IAAI,CAAC;YACf,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,OAAO,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,MAAM,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { LoomGraph } from './types.js';
2
+ export declare function readLoomGraph(options?: {
3
+ root?: string;
4
+ }): Promise<LoomGraph>;
5
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,wBAAsB,aAAa,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAMvF"}
package/dist/graph.js ADDED
@@ -0,0 +1,11 @@
1
+ import { abs, pathExists, readJson, resolveRoot } from './common.js';
2
+ import { readLoomConfig } from './config.js';
3
+ export async function readLoomGraph(options = {}) {
4
+ const root = resolveRoot(options.root);
5
+ const config = await readLoomConfig(root);
6
+ const file = abs(root, `${config.generated.graph}/current.json`);
7
+ if (!(await pathExists(file)))
8
+ throw new Error('missing .loom graph; run loom scan first');
9
+ return readJson(file);
10
+ }
11
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAA6B,EAAE;IACjE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,eAAe,CAAC,CAAC;IACjE,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC3F,OAAO,QAAQ,CAAY,IAAI,CAAC,CAAC;AACnC,CAAC"}
package/dist/help.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function helpText(): string;
2
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,IAAI,MAAM,CAuBjC"}
package/dist/help.js ADDED
@@ -0,0 +1,25 @@
1
+ export function helpText() {
2
+ return `loom - semantic repo collaboration over Frontier
3
+
4
+ Usage:
5
+ loom init [--name <name>] [--source <glob>] [--exclude <glob>] [--force]
6
+ loom scan [--json]
7
+ loom status [--json]
8
+ loom graph [--json]
9
+ loom diff [--json]
10
+ loom snapshot [-m <message>] [--json]
11
+ loom cat-file <object-id> [--json]
12
+ loom project --to <target> [--out <dir>] [--json]
13
+ loom doctor [--json]
14
+ loom swarm <frontier-swarm-codex args...>
15
+
16
+ Examples:
17
+ loom init --name emulator --source "src/**/*.ts"
18
+ loom scan
19
+ loom snapshot -m "source graph checkpoint"
20
+ loom cat-file <object-id> --json
21
+ loom project --to rust
22
+ loom swarm collect --run agent-runs/my-run
23
+ `;
24
+ }
25
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;CAqBR,CAAC;AACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { parseArgs } from './args.js';
2
+ export { createLoomConfig, readLoomConfig, writeLoomConfig } from './config.js';
3
+ export { diffLoomProject } from './diff.js';
4
+ export { readLoomGraph } from './graph.js';
5
+ export { initLoomProject } from './init.js';
6
+ export { createLoomProjectionPlan } from './project.js';
7
+ export { scanLoomProject, languageForPath } from './scan.js';
8
+ export { catLoomObject, snapshotLoomProject } from './snapshot.js';
9
+ export { doctorLoomProject, readLoomStatus } from './status.js';
10
+ export { readLoomObject, writeLoomObject, readHeadRef, readRef } from './store.js';
11
+ export { runSwarmCommand } from './swarm.js';
12
+ export type { JsonValue, LoomCommandResult, LoomConfig, LoomFileRecord, LoomGeneratedConfig, LoomGraph, LoomGraphSummary, LoomInitOptions, LoomLanguage, LoomScanOptions, LoomSemanticSummary, LoomSnapshotOptions, LoomSourceConfig } from './types.js';
13
+ //# 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,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export { parseArgs } from './args.js';
2
+ export { createLoomConfig, readLoomConfig, writeLoomConfig } from './config.js';
3
+ export { diffLoomProject } from './diff.js';
4
+ export { readLoomGraph } from './graph.js';
5
+ export { initLoomProject } from './init.js';
6
+ export { createLoomProjectionPlan } from './project.js';
7
+ export { scanLoomProject, languageForPath } from './scan.js';
8
+ export { catLoomObject, snapshotLoomProject } from './snapshot.js';
9
+ export { doctorLoomProject, readLoomStatus } from './status.js';
10
+ export { readLoomObject, writeLoomObject, readHeadRef, readRef } from './store.js';
11
+ export { runSwarmCommand } from './swarm.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { LoomCommandResult, LoomInitOptions } from './types.js';
2
+ export declare function initLoomProject(options?: LoomInitOptions): Promise<LoomCommandResult>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAErE,wBAAsB,eAAe,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyC/F"}
package/dist/init.js ADDED
@@ -0,0 +1,43 @@
1
+ import fs from 'node:fs/promises';
2
+ import { appendLineIfMissing, ensureDir, nowIso, resolveRoot, writeJson } from './common.js';
3
+ import { createLoomConfig, writeLoomConfig } from './config.js';
4
+ import { writeSymbolicHead } from './store.js';
5
+ export async function initLoomProject(options = {}) {
6
+ const root = resolveRoot(options.root);
7
+ const config = createLoomConfig({ ...options, root });
8
+ const configPath = await writeLoomConfig(root, config, options.force === true);
9
+ for (const dir of Object.values(config.generated)) {
10
+ await ensureDir(`${root}/${dir}`);
11
+ }
12
+ await ensureDir(`${root}/.loom/objects/pack`);
13
+ await ensureDir(`${root}/.loom/objects/info`);
14
+ await ensureDir(`${root}/.loom/refs/heads`);
15
+ await ensureDir(`${root}/.loom/refs/tags`);
16
+ await ensureDir(`${root}/.loom/logs/refs/heads`);
17
+ await writeSymbolicHead(root, 'refs/heads/main');
18
+ await writeJson(`${root}/.loom/repo.json`, {
19
+ kind: 'loom.repo',
20
+ version: 1,
21
+ name: config.name,
22
+ generatedAt: nowIso(),
23
+ configPath: 'loom.json',
24
+ graphPath: '.loom/graph/current.json'
25
+ });
26
+ await writeJson(`${root}/.loom/index.json`, {
27
+ kind: 'loom.index',
28
+ version: 1,
29
+ generatedAt: nowIso(),
30
+ entries: []
31
+ });
32
+ await fs.writeFile(`${root}/.loomignore`, `${[
33
+ '# Loom scan ignores',
34
+ 'node_modules/**',
35
+ 'dist/**',
36
+ 'coverage/**',
37
+ '.git/**',
38
+ '.loom/**'
39
+ ].join('\n')}\n`);
40
+ await appendLineIfMissing(`${root}/.gitignore`, '.loom/');
41
+ return { ok: true, message: `initialized ${config.name}`, path: configPath, config };
42
+ }
43
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA2B,EAAE;IACjE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAE/E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,SAAS,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;IAC3C,MAAM,SAAS,CAAC,GAAG,IAAI,wBAAwB,CAAC,CAAC;IACjD,MAAM,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAEjD,MAAM,SAAS,CAAC,GAAG,IAAI,kBAAkB,EAAE;QACzC,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,EAAE;QACrB,UAAU,EAAE,WAAW;QACvB,SAAS,EAAE,0BAA0B;KACtC,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,GAAG,IAAI,mBAAmB,EAAE;QAC1C,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,MAAM,EAAE;QACrB,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,cAAc,EAAE,GAAG;QAC3C,qBAAqB;QACrB,iBAAiB;QACjB,SAAS;QACT,aAAa;QACb,SAAS;QACT,UAAU;KACX,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,MAAM,mBAAmB,CAAC,GAAG,IAAI,aAAa,EAAE,QAAQ,CAAC,CAAC;IAE1D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AACvF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function printResult(value: unknown, json: boolean): void;
2
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAe/D"}
package/dist/output.js ADDED
@@ -0,0 +1,45 @@
1
+ export function printResult(value, json) {
2
+ if (json) {
3
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
4
+ return;
5
+ }
6
+ if (isGraph(value)) {
7
+ printGraph(value);
8
+ return;
9
+ }
10
+ if (isResult(value)) {
11
+ process.stdout.write(`${value.ok ? 'ok' : 'error'}: ${value.message}\n`);
12
+ printKnownFields(value);
13
+ return;
14
+ }
15
+ process.stdout.write(`${String(value)}\n`);
16
+ }
17
+ function printGraph(graph) {
18
+ const summary = graph.summary;
19
+ process.stdout.write(`loom graph: ${summary.files} files, ${summary.bytes} bytes\n`);
20
+ process.stdout.write(`semantic: ${summary.semanticImports} imported, ${summary.semanticFailures} failed\n`);
21
+ process.stdout.write(`symbols: ${summary.semanticSymbols}, regions: ${summary.semanticOwnershipRegions}, hints: ${summary.semanticPatchHints}\n`);
22
+ }
23
+ function printKnownFields(result) {
24
+ if (typeof result.path === 'string')
25
+ process.stdout.write(`path: ${result.path}\n`);
26
+ if (typeof result.objectId === 'string')
27
+ process.stdout.write(`object: ${result.objectId}\n`);
28
+ if (typeof result.ref === 'string')
29
+ process.stdout.write(`ref: ${result.ref}\n`);
30
+ if (result.graphSummary)
31
+ process.stdout.write(`graph: ${JSON.stringify(result.graphSummary)}\n`);
32
+ if (Array.isArray(result.added) || Array.isArray(result.changed) || Array.isArray(result.deleted)) {
33
+ process.stdout.write(`added: ${arrayCount(result.added)}, changed: ${arrayCount(result.changed)}, deleted: ${arrayCount(result.deleted)}\n`);
34
+ }
35
+ }
36
+ function isGraph(value) {
37
+ return Boolean(value && typeof value === 'object' && value.kind === 'loom.graph');
38
+ }
39
+ function isResult(value) {
40
+ return Boolean(value && typeof value === 'object' && typeof value.ok === 'boolean');
41
+ }
42
+ function arrayCount(value) {
43
+ return Array.isArray(value) ? value.length : 0;
44
+ }
45
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,IAAa;IACvD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACzE,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,CAAC,KAAK,WAAW,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC;IACrF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,eAAe,cAAc,OAAO,CAAC,gBAAgB,WAAW,CAAC,CAAC;IAC5G,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,eAAe,cAAc,OAAO,CAAC,wBAAwB,YAAY,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;AACpJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAyB;IACjD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IACpF,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC9F,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACjF,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACjG,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAClG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/I,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAmB,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAA2B,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;AAC7G,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { LoomCommandResult } from './types.js';
2
+ export declare function createLoomProjectionPlan(options: {
3
+ root?: string;
4
+ target: string;
5
+ outDir?: string;
6
+ }): Promise<LoomCommandResult>;
7
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,wBAAsB,wBAAwB,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2BtI"}
@@ -0,0 +1,33 @@
1
+ import { nowIso, resolveRoot, writeJson } from './common.js';
2
+ import { readLoomConfig } from './config.js';
3
+ import { readLoomGraph } from './graph.js';
4
+ export async function createLoomProjectionPlan(options) {
5
+ const root = resolveRoot(options.root);
6
+ const config = await readLoomConfig(root);
7
+ const graph = await readLoomGraph({ root });
8
+ const target = options.target.trim();
9
+ if (!target)
10
+ throw new Error('project requires --to <target>');
11
+ const plan = {
12
+ kind: 'loom.projectionPlan',
13
+ version: 1,
14
+ generatedAt: nowIso(),
15
+ target,
16
+ sourceGraph: `${config.generated.graph}/current.json`,
17
+ sourceGitHead: graph.gitHead,
18
+ summary: graph.summary,
19
+ routes: graph.files.map((file) => ({
20
+ sourcePath: file.path,
21
+ sourceLanguage: file.language,
22
+ sourceHash: file.sha256,
23
+ target,
24
+ status: file.semantic?.ok ? 'semantic-imported' : 'hash-only',
25
+ semantic: file.semantic
26
+ }))
27
+ };
28
+ const outDir = options.outDir ?? config.generated.projections;
29
+ const outFile = `${root}/${outDir}/${target}.json`;
30
+ await writeJson(outFile, plan);
31
+ return { ok: true, message: `wrote ${target} projection plan`, path: outFile, plan };
32
+ }
33
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAA2D;IACxG,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,MAAM,EAAE;QACrB,MAAM;QACN,WAAW,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,eAAe;QACrD,aAAa,EAAE,KAAK,CAAC,OAAO;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjC,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,cAAc,EAAE,IAAI,CAAC,QAAQ;YAC7B,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW;YAC7D,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;KACJ,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;IAC9D,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,MAAM,IAAI,MAAM,OAAO,CAAC;IACnD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,MAAM,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvF,CAAC"}
package/dist/scan.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { LoomGraph, LoomLanguage, LoomScanOptions } from './types.js';
2
+ export declare function scanLoomProject(options?: LoomScanOptions): Promise<{
3
+ ok: boolean;
4
+ graph: LoomGraph;
5
+ }>;
6
+ export declare function collectSourceFiles(root: string): Promise<string[]>;
7
+ export declare function languageForPath(file: string): LoomLanguage;
8
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAkB,SAAS,EAAE,YAAY,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAC;AAMhH,wBAAsB,eAAe,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAsD/G;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAExE;AAuFD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAY1D"}